【问题标题】:Customized sorting on DataTable in C#?在 C# 中对 DataTable 进行自定义排序?
【发布时间】:2011-01-08 01:31:26
【问题描述】:

这是一个 C# Winform 问题。我有一个绑定到 DataTable 的 DataGridView。我自己构建了 DataTable,其中有几个 DataColumn 实例。当 DataTable 绑定到 DataGridView 时,默认情况下,每列都可以通过单击 DataGridView 的标题进行排序。

但是排序行为是“默认”的。好像是按字符串排序的。即使我把它作为我的代码也是如此:

DataColumn dc = new DataColumn("MyObjectColumn", typeof(MyObject));

并且 MyObject 已经覆盖了 ToString() 并实现了 IComparable 接口。这意味着即使我已经告诉 DataTable 如何使用 IComparable 接口的实现对特殊列进行排序,DataGridView 仍然没有按照我期望的方式进行。

那么如何让 DataTable 以我想要的方式对数据进行排序呢?

感谢您的回答。

【问题讨论】:

    标签: c# winforms datagridview datatable


    【解决方案1】:

    我今天不得不处理这个问题。我已经实现了自然排序(帽子提示:Natural Sort Order in C#)并且必须对 DataTable 进行排序。这更像是一种“低保真”方法,但它对我正在使用的小型数据集起到了作用。

    我正在排序列和 DataRow 本身之间创建键/值值关系,并将其弹出到使用 IComparer 构造的 SortedList 中。

    DataTable myDataTable = {all my data...}
    SortedList myDataNaturallySorted = new SortedList(new NaturalComparer());
    
    foreach (DataRow dataRow in myDataTable.AsEnumerable())
        myDataNaturallySorted.Add(dataRow["columWithKeyName"].ToString(), dataRow);
    

    然后我使用排序列表作为转发器的数据源继续前进。

    【讨论】:

      【解决方案2】:

      我建议使用 DataTable 的 DefaultView。它有一些内置的排序功能,可扩展性更高。最简单的是 RowFilter,但如果您的数据类型在表级别被覆盖为 .ToString(),我不确定这是否就是您要查找的内容。

      编辑:添加代码 sn-p

      这样的自定义方法甚至可能覆盖或在 DataGridView 的排序事件期间调用,可能能够在绑定实际发生之前对 DataView 进行排序。但据我了解,除非您指定要调用它,否则永远不会调用 IComparable。

      protected void SortGrid()
      {
          System.Data.DataView dv = myDataTable.DefaultView;
      
          myOjbect comparer = new MyObject();
      
         // Comparer specifics go here. Sort order, column/fieldname etc
         // or any custom properties used in sorting
      
         dv.Sort(comparer)
      
         dgMyGrid.DataSource = dv
         dgMyGrid.DataBind()
      
      }
      

      【讨论】:

      • 谢谢乔尔。我知道 DefaultView 可以让您对排序进行一些控制。但据我所知,它仅限于列和排序顺序。我手上的是一些更复杂的排序,例如根据数值而不是转换字符串的字面值排序。在我看来,过滤在这里是毫无疑问的。我不想过滤任何行,只是按照我想要的方式重新排序。有什么进一步的建议或提示吗?
      • 好吧,如果你已经实现了 IComparable 但那不起作用,我真的只能建议两件事:弄清楚它为什么不起作用或降低保真度。低保真:编写一个静态方法,根据MyObject(不受欢迎)按照您想要的排序顺序逐行重建表格。排序是否以任何合理的方式出现问题?您的 IComparable 是否可能没有按您的预期执行?或者您的 IComparable 是否有可能永远无法到达?
      • Joel:当然 IComparable 方法永远不会达到,否则不会有问题。让我困惑的是,即使 DataColumn 知道绑定到它的数据的类型并且该类型实现了 IComparable,当从网格排序时,.net 似乎也没有使用 IComparable 对数据进行排序。排序是如何进行的?如何自定义行为?
      • 好吧,我已经阅读了 IComparer(我对它没有太多经验),您需要显式调用排序功能。使用的默认 sort() 调用永远不会访问它。我在上面使用 EDIT 来输入代码 sn-p “在黑暗中射击”。
      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多