使用Datatable对Gridview进行排序

3

我有一个GridView,希望能够在单击任何列标题时对其进行排序。有一个DataTable是在运行时构建的,并分配给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


在这样做中似乎有什么问题?您在gdvMainList_Sorting中有什么? - Waqas
我还没有在那个事件处理程序中编写任何内容。问题是我不知道如何根据我的网格和数据表处理该事件。 - asma
2个回答

9

首先,需要将GridViewAllowSorting属性设置为true,然后为每个需要排序的列添加SortExpression属性:

SortExpression属性指示在单击该字段的排序标题链接时应使用的表达式来对数据进行排序

以您上面的代码中的BoundField为例,我已经添加了一个值为BrandNameSortExpression属性,这意味着当单击BrandName列标题时,将使用您的DataTable中的'BrandName'列来对数据进行排序:

现在,在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. 使用VB.net进行GridView排序
  2. 排序和分页教程

我在排序事件处理程序中添加的一段代码是:if(viewState["SortColumn"] <> e.SortExpressions) ViewState["sortDirection"] = null; ViewState["SortColumn"] = e.SortExpression; 当您单击不同的列时,它会默认返回到ASC。 - dko

0

为了对网格视图的行进行排序,您应该使用 SortDescription 类构造函数,并将两个参数传递给该类,即排序值和排序方向。有关更多详细信息,请参考 根据单击的列对网格行进行排序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接