1

我有一个正在填充的网格视图。现在我想启用排序。我已经完成了所有必需的代码 - 即启用对标记的排序并在用户排序时提供要调用的事件。

它是我丢失的排序事件 - 我已经尝试了谷歌的一些实现,但我不太确定。基本上我是否正确地说我需要根据用户想要排序的列以及 ASC 或 DESC 向服务器提供新的查询?如果是这样,这听起来需要更多的工作......更多的查询。

谢谢达摩

绑定网格的代码

 // Load the main homepage data to the grid
                    FAServices fServices = new FAServices(sConn);
                    FAAuditOverallStatusLatest fAuditOverallStatusLatest = new FAAuditOverallStatusLatest(sConn);
                    GridViewMain.DataSource = fAuditOverallStatusLatest.getAuditOverallStatusLatest();
                    GridViewMain.DataBind();

排序后的代码

protected void GridViewMain_Sorting(object sender, GridViewSortEventArgs e)
{

    // Switch statements required here along with Query for each column i have in the grid




}

网格标记

<asp:GridView ID="GridViewMain" OnRowDataBound="GridViewMainRowDataBound" OnPageIndexChanging="GridViewMain_PageIndexChanging"
                                        runat="server"  AllowPaging="True" PageSize="50" PagerSettings-Position="TopAndBottom"
                                        CssClass="mGrid"
                                        PagerStyle-CssClass="pgr"
                                        AlternatingRowStyle-CssClass="alt data-row"
                                        OnRowCreated="GridViewMain_RowCreated"                          
                                        RowStyle-CssClass="data-row"                                        
                                        AllowSorting="True"
                                        OnSorting="GridViewMain_Sorting"
                                        >
                                     </asp:GridView>
4

2 回答 2

2

我是否正确地说我需要根据用户想要排序的列以及 ASC 或 DESC 向服务器提供新的查询?如果是这样,这听起来需要更多的工作......更多的查询。

是的,你是对的。您需要再次查询数据源以应用新排序。但是最后一句话是不对的。你只需要改变ORDER BY你的 sql (或者你用来订购的任何东西DataSource)。您可以ViewState为订单列和方向使用一个变量(您需要在回发中保留它,因此需要 ViewState)。我给你看一个例子:

首先,您需要设置SortExpression

<asp:TemplateField HeaderText="Name" SortExpression="Name">
    <ItemTemplate>
        <a href='sometest.aspx?ID=<%# DataBinder.Eval(Container.DataItem, "TestID").ToString()%>'><%# DataBinder.Eval(Container.DataItem, "Type").ToString()%></a>
    </ItemTemplate> 
</asp:TemplateField>    
<asp:TemplateField HeaderText="Address" SortExpression="Address">
    <ItemTemplate>
                <div align="right"><%# (DataBinder.Eval(Container.DataItem, "HouseNumber"))%></div>
    </ItemTemplate> 
</asp:TemplateField>            

在代码隐藏中,您可以存储当前SortExpressionSortDirectionin ViewState

private string SortExpression {
    get {
        if(String.IsNullOrWhiteSpace((String)ViewState["SortExpression"])
            ViewState["SortExpression"] = "Name ASC";

        return (String)ViewState["SortExpression"];
    }
    set { ViewState["SortExpression"] = value; }
}

这是Sorting事件处理程序。请注意,这BindGrid是您设置DataSource和调用的方法GridView.DataBind

protected void theGrid_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
{
    string currentSortColumn = null;
    string currentSortDirection = null;
    currentSortColumn = this.SortExpression.Split(' ')[0];
    currentSortDirection = this.SortExpression.Split(' ')[1];

    if (e.SortExpression.Equals(currentSortColumn)) {
        //switch sort direction
        switch (currentSortDirection.ToUpper()) {
            case "ASC":
                this.SortExpression = currentSortColumn + " DESC";
                break;
            case "DESC":
                this.SortExpression = currentSortColumn + " ASC";
                break;
        }
    } else {
        this.SortExpression = e.SortExpression + " ASC";
    }

    //load the data with this SortExpression and DataBind the Grid
    BindGrid();
}
于 2012-09-21T22:03:43.147 回答
1

我有一个更简单的几行方法:(vb.net 中的代码,在 c# 中翻译很容易)

Dim SortDirection As String, SortExpression As String
SortExpression = e.SortExpression
If (SortExpression = ViewState("SortExpression") And ViewState("SortDirection") = "asc") Then
    SortDirection = "desc"
Else
    SortDirection = "asc"
End If
ViewState("SortDirection") = SortDirection
ViewState("SortExpression") = SortExpression

Dim dt As Data.DataTable = ds.Tables(0) '<<<< fill ds with a method
dt.DefaultView.Sort = SortExpression & " " & SortDirection

GridView1.DataSource = dt.DefaultView
GridView1.DataBind()

就这样。然后很容易将此代码放在通用类中,以应用于其他网格视图

于 2013-04-25T13:26:39.073 回答