如何通过datagrid Source在c#中动态排序列表

时间:2013-04-20 13:29:00

标签: c# sorting dynamic

在这里,我有一个DatagridView绑定到一个对象列表 - 没关系。 我所做的是一次列出10个左右的结果,其中结果可以使用下一个和上一个按钮导航,这些按钮只是从结果中获取结果并显示它们。

问题在于我希望源按照在Datagrid视图中单击列的顺序排序 - 而不仅仅是当时正在查看的结果,所有结果。

我终于开始接近了。我可以比较我的源,甚至可以通过用于调用数据值的列的名称来设置顺序。 我需要知道的是我可以自动设置数据类型:

AppSettings.Instance.SearchResults.Sort(
    new Comparison<SearchResult>(
        (x, y) =>
        ((Int32) x.GetType().GetProperty("Links").GetValue(x, null)).CompareTo(
            ((Int32) y.GetType().GetProperty("Links").GetValue(y, null)))));

这里我将属性设置为Links,这是一个Int。即使它知道CompareTo,我也无法在不转换值的情况下使用Int32。我比较的一些值将是DateTime类型,所以我需要知道它是否可以比较并动态获取数据类型,因为我现在离我很近。

摘要 - 我想自动识别动态调用的属性值的数据类型。

1 个答案:

答案 0 :(得分:1)

我不确定这是否是最好的'前进方向',为你做你想做的事。

如果适用,我宁愿使用IComparable<T> ,例如

int BetterComparison<T>(T x, T y) where T : IComparable<T>
{
    return x.CompareTo(y);
}

并称之为:

BetterComparison(10, 20);
BetterComparison(DateTime.Now, DateTime.Now.AddDays(1));

如果你仍然想出于某种原因求助于反思(或者有更多通用的东西 - 或者没有像这样的任何界面定义)...

您应该reflect针对特定类型的CompareTo方法 - 然后只使用您拥有的值进行调用。例如。这样的事情(在你的方法中):

// x.GetType() and y.GetType() should be interchangable by the nature of it
var compareMethod = x.GetType().GetMethod("CompareTo", new[] { y.GetType() });
return (int)compareMethod.Invoke(x, new object[]{y});

这允许你这样称呼它:

var ret1 = Comparison(10, 20);
var ret2 = Comparison(DateTime.Now, DateTime.Now.AddDays(1));