这是一个C#Winform问题。我有一个DataGridView,它绑定到DataTable。我自己构建了DataTable,其中有几个DataColumn实例。当DataTable绑定到DataGridView时,默认情况下,通过单击DataGridView的标题可以对每个列进行排序。
但排序行为是“默认情况下”。它似乎按字符串排序。即使我把它作为我的代码也是如此:
DataColumn dc = new DataColumn(“MyObjectColumn”,typeof(MyObject));
MyObject已重写ToString()并已实现IComparable接口。这意味着即使我告诉DataTable如何使用IComparable接口的实现对特殊列进行排序,DataGridView仍然没有按照我期望的方式进行。
那么如何让DataTable以我想要的方式对数据进行排序?
感谢您的回答。
答案 0 :(得分:1)
我建议使用DataTable的DefaultView。它有一些内置的排序功能,可以扩展得更多。最简单的是RowFilter,但是我不确定如果您的数据类型在表级被覆盖为.ToString(),那么这将是您正在寻找的。 p>
编辑:添加了代码段
这样的自定义方法甚至可能会覆盖或在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);
然后我使用排序列表作为我的转发器的数据源。