在C#中对DataTable进行自定义排序?

时间:2010-01-22 04:09:03

标签: c# winforms datagridview datatable

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

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

DataColumn dc = new DataColumn(“MyObjectColumn”,typeof(MyObject));

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

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

感谢您的回答。

2 个答案:

答案 0 :(得分:1)

我建议使用DataTable的DefaultView。它有一些内置的排序功能,可以扩展得更多。最简单的是RowFilter,但是我不确定如果您的数据类型在表级被覆盖为.ToString(),那么这将是您正在寻找的。

编辑:添加了代码段

这样的自定义方法甚至可能会覆盖或在DataGridView的sort事件期间调用它可能能够在绑定实际发生之前对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()

}

答案 1 :(得分:0)

我今天必须处理这件事。我实现了一种自然排序(帽子提示: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);

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