.net GridView的分层(多列)排序?

时间:2009-09-15 19:44:19

标签: .net gridview sorting

是否有简单的“.Net”方式进行分层排序

...表

A|B|C
-----
1|2|5
2|8|4
2|4|3
3|7|2
4|4|1

点击A,然后B就能找到你......

A|B|C
-----
1|2|5
2|4|3
2|8|4
3|7|2
4|4|1

变化是我在(A)的背景下排序(B)等等。

显然这可以在数据源中管理,但是想知道某人是否有一个优雅且可扩展的解决方案..谢谢。

3 个答案:

答案 0 :(得分:2)

如果您要求与分页一起使用,那么就没有简单且可扩展的解决方案。事实上,这是商业应用程序Web开发的一个圣杯。例如,请参阅StackOverflow问题Dynamic Sorting within SQL Stored Procedures,它涉及同样的事情。毕竟,如果我们在数据库服务器上进行动态排序,我们只需要编写用于管理用户排序选择的机制。

对于多列排序,您实际上只有三个选项:

  • 在客户端中执行此操作,让您的数据容器执行繁重的工作(当您使用内置此功能的数据容器时,例如System.Data.DataView)。

  • 编写自己的算法并在绑定前自行对数据进行排序。

  • 通过上述链接中讨论的解决方案之一在数据库服务器上执行此操作。

这两种客户端解决方案都不具备可扩展性,因为它们涉及在您可能只需要一个子集时提取和提供所有数据。

答案 1 :(得分:2)

为了让一个ASP.NET GridView在BoundField的Sort规范中列出多列时正确排序,你需要将网格的OnSorting事件绑定到这个函数:

protected void gridViewSorting(object sender, GridViewSortEventArgs e)
{
    //
    // This odd function permits GridView objects to sort on multiple columns
    // Without this function, a GridView object does not sort correctly when multiple
    // columns are named in its sort specification.
    //

    if (!(sender is GridView))
    {
        return;
    }
    if (!e.SortExpression.Contains(','))
    {
        return;
    }

    GridView gv = sender as GridView;

    //
    // Find the column that is to become the basis of the sort
    //
    foreach (DataControlField dc in gv.Columns)
    {
        String fieldSortExprClean = dc.SortExpression.Replace(" DESC", "");
        fieldSortExprClean = fieldSortExprClean.Replace(" ASC", "");

        String eventSortExprClean = e.SortExpression.Replace(" DESC", "");
        eventSortExprClean = eventSortExprClean.Replace(" ASC", "");

        if (fieldSortExprClean == eventSortExprClean)
        {
            if (e.SortDirection == SortDirection.Ascending)
            {
                dc.SortExpression = fieldSortExprClean.Replace(",", " ASC,");
                e.SortExpression = fieldSortExprClean.Replace(",", " ASC,");
            }
            else
            {
                dc.SortExpression = fieldSortExprClean.Replace(",", " DESC,");
                e.SortExpression = fieldSortExprClean.Replace(",", " DESC,");
            }
        }
    }
}

答案 2 :(得分:0)

ASPX页面

<asp:GridView id="MyGridView" runat="server" AllowSorting="true" OnSorting="MyGridView_OnSorting">
    <asp:BoundField DataField="ColumnA" SortExpression="A" />
    <asp:BoundField DataField="ColumnB" SortExpression="B" />
    <asp:BoundField DataField="ColumnC" SortExpression="C" />
</asp:GridView>

背后的代码

protected void MyGridView_OnSorting(object sender, GridViewSortEventArgs e)
{
    List<MyEntity> data = MyBLL.GetDataSource();

    data.Sort(delegate(MyEntity x, MyEntity y) {
        switch(e.SortExpression)
        {
            case "ColumnA":
               return String.Compare(x.ColumnA, y.ColumnA);
               break;
            case "ColumnB":
               return String.Compare(x.ColumnB, y.ColumnB);
               break;
            case "ColumnC":
               return String.Compare(x.ColumnC, y.ColumnC);
               break;
        }
    }
    );

    MyGridView.DataSource = data;
    MyGridView.DataBind();
}