Jen

ListView塔配Linq做資料排序(非使用LinqDataSource)

以前2.0時期後台的basepage,不管是篩選、排序、分頁,

都用了大量的sql 組合句,

而且在機制上,有時使用postback,有時使用get,

所以會用session或者viewstate去存取篩選、排序、分頁等等狀態,

感覺非常亂,

3.5出來了(出很久了= =),LINQ也有大量的愛好者了,

自從退伍有工作後,一直在弄一個適合自已用的basepage,

第一次使用3.5的一些新東西(對我來說算新),

今天終於是把ListView+Linq排序的功能弄好了,

也是後台所有基本功能的最後一個,完成了基本款basepage.

 

記錄一下我如何用ListView+Linq(不是LinqDataSource)去實作排序這個部分的.

 

 

1.首先在ListView的<LayoutTemplate>去加上一個<asp:LinkButton> ,

  主要是CommandNameCommandArgument的設定,

  把CommandName 設定為Sort 會, 會觸發ListView.Sort()事件.

<asp:ListView ID="Lv_List" runat="server" DataKeyNames="Id">
   <LayoutTemplate>
       <tr id="Tr1" class="header" runat="server">
           <th> 
               <asp:LinkButton runat="server" ID="sortBtn1" 
                    Text="NAME" 
                    CommandName="Sort" 
                    CommandArgument="name">
               </asp:LinkButton>
           </th>
       </tr>
   </LayoutTemplate>
</asp:ListView>

 

2.在BasePage.cs中去定義方法,使用ViewState去記綠SortDirectionSortColumn ,

   如下(BasePage.cs檔)

protected virtual void Page_Init(object sender, EventArgs e)
{
   Base_ListView.Sorting += 
        new EventHandler<ListViewSortEventArgs>(Base_ListView_Sorting);
}

protected virtual void Base_ListView_Sorting(object sender, ListViewSortEventArgs e)
{
   if (ViewState["sortDire"] == null)
   {
       ViewState["sortDire"] = e.SortDirection;
   }
   else
   {
       if (((SortDirection)ViewState["sortDire"]) == SortDirection.Ascending)
           ViewState["sortDire"] = SortDirection.Descending;
       else
           ViewState["sortDire"] = SortDirection.Ascending;
   }
   ViewState["sortCol"] = e.SortExpression;
}

為什麼要存ViewState?

1.因為所有排序、篩選都寫在ListView.PreRender, 所以先存在viewState

,到了PreRender事件時,再用linq開始做資料的排序.

 

3.假設我有個會員管理的頁面(Member),

   繼承BasePage之後,覆寫Base_ListView_PreRender方法,如下

protected override void Base_ListView_PreRender(object sender, EventArgs e)
{
   dcMemberDataContext dc = new dcMemberDataContext();
   var vTable = from p in dc.MEMBER
                select p;
   //Sort
   if (ViewState["sortDire"] != null &&
       ViewState["sortCol"] != null)
   {
       if ((SortDirection)ViewState["sortDire"] ==
            SortDirection.Ascending)
       {
           vTable = vTable.OrderBy(orderByExp());
       }
       else
       {
           vTable = vTable.OrderByDescending(orderByExp());
       }
   }
   else
   {
       vTable = vTable.OrderByDescending(p => p.ID);
   }
   Session[ClassName + "dt"] = vTable;
   Lv_List.DataSource = vTable;
   Lv_List.DataBind();
}

 

4.看到orderByExp(),你可能會想那是什麼, 就是OrderBy的Expression,

   定義如下:

private Expression<Func<JEN_MEMBER, string>> orderByExp()
{
   switch (ViewState["sortCol"].ToString())
   {
       case "name": return (p) => p.name; break;
       case "phone": return (p) => p.phone; break;
       case "email": return (p) => p.email; break;
       case "CTIME": return (p) => p.CTIME.ToString(); break;
       default: return (p) => p.name; break;
   }
}
※這段需要每次重新定義,因為每個table的欄位都不一樣,
我還沒想到更好的做法,等我有想到再記錄下來.
 
就這樣.
按欄位的Header就會幫你排序囉.
SOrt 
 
 
有人可能覺得組Sql語法還來得比較簡單,這個就見人見志了,
既然都買了跑車,總是要拿來狂飆一下,
裝了.NET3.5 偶爾要用一下,不然可惜了強大的功能.
 
(話說都快忘了ADO.NET的寫法…)
 
 

0 意見: