2011-09-06 81 views
3

我有一個gridview,我想在點擊任何列標題時進行排序。有一個DataTable構建在運行時並分配給gridview來填充數據。下面是數據表和GridView:使用Datatable對Gridview排序

DataTable dtMedication = new DataTable(); 
dtClientMedications.Columns.Add("Id"); 
dtClientMedications.Columns.Add("BrandName"); 
dtClientMedications.Columns.Add("GenericName"); 
dtClientMedications.Columns.Add("Dosage"); 
dtClientMedications.Columns.Add("Physician"); 
dtClientMedications.Columns.Add("DatePrescribed"); 
dtClientMedications.Columns.Add("Status"); 
dtClientMedications.Columns.Add("ClientMedicationDataId"); 

<asp:GridView ID="gdvMainList" runat="server" AutoGenerateColumns="False" 
          SkinID="PagedGridView" onrowcommand="gdvMainList_RowCommand" 
          DataKeyNames="Id" onsorting="gdvMainList_Sorting"> 
          <PagerStyle CssClass="gridpager" HorizontalAlign="Right" /> 
          <Columns> 
           <ucc:CommandFieldControl HeaderText="Actions" ShowDeleteButton="true" ButtonType="Image" 
            DeleteImageUrl="~/App_Themes/Default/images/delete.png" ShowEditButton="true" 
            EditImageUrl="~/App_Themes/Default/images/edit.png" DeleteConfirmationText="Are you sure you want to delete?"> 
            <ItemStyle HorizontalAlign="Center" Width="60px" /> 
           </ucc:CommandFieldControl> 
           <asp:BoundField DataField="BrandName" HeaderText="Brand Name" /> 
           <asp:BoundField DataField="GenericName" HeaderText="Generic Name" /> 
           <asp:BoundField DataField="Dosage" HeaderText="Dosage" /> 
           <asp:BoundField DataField="Physician" HeaderText="Physician" /> 
           <asp:BoundField DataField="DatePrescribed" HeaderText="Date Prescribed" /> 
           <asp:BoundField DataField="Status" HeaderText="Status" /> 
           <asp:TemplateField HeaderText=""> 
            <ItemStyle CssClass="HiddenCol" Width="0px" /> 
            <HeaderStyle CssClass="HiddenCol" /> 
            <ItemTemplate> 
             <asp:HiddenField ID="hdfClientMedicationDataId" runat="server" Value='<%#Bind("ClientMedicationDataId") %>' /> 
            </ItemTemplate> 
           </asp:TemplateField> 
          </Columns> 
          <EmptyDataTemplate> 
           <div class="divEmptyGrid"> 
            --- No Medication Exists --- 
           </div> 
          </EmptyDataTemplate> 
         </asp:GridView> 

enter image description here

+0

什麼似乎在這樣的問題?你有什麼gdvMainList_Sorting? – Waqas

+0

我還沒有寫過任何事件處理程序。問題是我不知道如何處理該事件根據我的網格和數據表 – asma

回答

9

第一步設置的GridViewtrueAllowSorting屬性然後添加SortExpression屬性爲每個列你會用於排序:

SortExpression屬性指示應該是 使用時排序的數據的表達字段的排序標題鏈接被點擊

讓我們考慮從上面的代碼BoundField,我添加了一個SortExpression屬性與值設置爲BrandName這意味着當列標題爲BrandName被點擊列「名優產品」你DataTable將被用來對數據進行排序:在gdvMainList_Sorting事件

現在,你必須重新綁定網格排序的數據:

protected void gdvMainList_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e) 
{ 
    //Using DataView for sorting DataTable's data 
    DataView view = dtMedication.DefaultView; 
    view.Sort = String.Format("{0} {1}", e.SortExpression, GetSortingDirection()); 
    gdvMainList.DataSource = view; 
    gdvMainList.DataBind(); 
} 

如果已經注意到我已經使用getSortingDirection(),它返回任一「ASC」或「DESC」的升序或降序進行排序,排序數據的方法。

protected string GetSortingDirection() 
{ 
    if(ViewState["SortDirection"] == null) 
     ViewState["SortDirection"] = "ASC"; 
    else if(ViewState["SortDirection"] == "ASC") 
     ViewState["SortDirection"] = "DESC"; 
    else 
     ViewState["SortDirection"] = "ASC"; 

    return ViewState["SortDirection"]; 
} 

一些有用的鏈接:

  1. GridView sorting using VB.net
  2. Sorting and Paging tutorial
+0

非常感謝你 – FreedomDeveloper

+0

在排序事件處理程序中添加的代碼的一個snippit是if(viewState [「SortColumn」] <> e.SortExpressions)ViewState [ 「sortDirection」] = null; ViewState [「SortColumn」] = e.SortExpression;當你點擊不同的列時,這個默認返回ASC – dko

0

進行行排序時,你應該使用SortDescription類的構造網格視圖和傳遞兩個參數到這個類,即sortby價值也方向排序。有關更多詳細信息,請參閱Sort gridrows based on column click