2011-09-06 128 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