【问题标题】:asp.net gridview sorting custom datasourceasp.net gridview 排序自定义数据源
【发布时间】:2012-09-14 08:25:56
【问题描述】:

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

它是我丢失的排序事件 - 我已经尝试了 Google 的一些实现,但我不太确定。基本上我是否正确地说我需要根据用户想要排序的列以及 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>

【问题讨论】:

  • 您是正确的,查询需要处理排序方向。您还需要决定在视图状态、url 或会话中存储当前排序方向的位置。

标签: asp.net gridview


【解决方案1】:

我是否正确地说我需要向 服务器取决于用户想要排序的列和 ASC 或 也有DESC?如果是这样,这听起来需要更多的工作......更多的查询。

是的,你是对的。您需要再次查询数据源以应用新排序。但是最后一句话是不对的。您只需要更改 sql 的 ORDER BY(或用于订购 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>            

在代码隐藏中,您可以将当前的SortExpressionSortDirection 存储在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();
}

【讨论】:

  • 您好,在您的代码末尾,您说“//使用此 SortExpression 和 DataBind the Grid 加载数据”。你的意思是“//用这个SortExpression和currentSortColumn和DataBind Grid加载数据”
  • @user1438082:不,您可以看到SortExpression 包含两者,currentSortColumn + SortDirection。这意味着您只需要将 SortExpression 附加到 sql 的 ORDER BY 的末尾。这种方法支持双向排序,如果用户连续单击同一列,SortDirection 会更改该列。请注意SorteExpression 属性有一个默认排序,请相应地更改它。
【解决方案2】:

我有一个更简单的几行方法:(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()

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

【讨论】:

  • 我发现到目前为止使用 Telerik 或 devexpress gridview 控件更容易。它们具有内置功能,可以为您节省数周时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2010-09-13
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多