【问题标题】:Hierarchical (Multi-column) Sorting for the .net GridView?.net GridView 的分层(多列)排序?
【发布时间】:2010-11-28 14:13:59
【问题描述】:

有没有一种简单的“.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) 进行排序等等。

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

【问题讨论】:

    标签: .net gridview sorting


    【解决方案1】:

    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();
    }
    

    【讨论】:

    • 除非我疯了,否则这只会排序一列,对吧?
    • 那么如果点击A列,需要按照A、B、C的顺序排序吗?如果用户点击B,那么排序顺序是B,A,C?如果这是您期望的排序方式?
    • 这是此场景中的另一个示例。用户单击 A,然后单击 C。网格应先排序 A,然后是 C。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      为了让 ASP.NET GridView 在 BoundField 的排序规范中列出多个列时正确排序,您需要将网格的 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,");
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多