【问题标题】:Sort WPF datagrid with integer appended with string使用附加字符串的整数对 WPF 数据网格进行排序
【发布时间】:2014-05-04 20:18:48
【问题描述】:

我有一个 wpf 数据网格。我将 ObservableCollection 分配给它。

DG1.DataContext = a; 

其中一列的值如下

1_A_B
12_A1_B
3_A2_B
10_A3_B
2_A4_B
15_A5_B

我想使用第一个整数值对数据网格进行排序,如下所示

1_A_B
2_A4_B
3_A2_B
10_A3_B
12_A1_B
15_A5_B

如果我使用此列进行排序,它将被视为字符串升序,如下所示(这不是我想要的)

1_A_B
10_A3_B
12_A1_B
15_A5_B
2_A4_B
3_A2_B

我想使用上列中的第一个整数值进行排序

【问题讨论】:

  • AutoGenerateColumns吗?您可以添加另一列来查看该行的模型,该行将为您提供该值的第一部分作为 int 吗?
  • 我使用 AutoGenerateColumns=false。我不想向 datagrid 或 ObservableCollection. 添加新列

标签: c# wpf xaml sorting wpfdatagrid


【解决方案1】:

1_A_B12_A1_B 等将包含在绑定到该列的属性中。我们称之为PropertyA

实现这一点的最简单方法可能是在数据对象上添加另一个属性,我们称之为YourSortOrder。当PropertyA 上的设置器被调用时使用非空值,您可以使用简单的字符串操作和int.Parse() 来提取数值并将其分配给YourSortOrder

这段代码不是生产质量,但说明了这一点:

public string PropertyA
{
    get { ... }
    set
    {
        _propertyA = value;
        if (value != null)
            YourSortOrder = int.Parse(value.Substring(0, value.IndexOf("_", StringComparison.InvariantCultureIgnoreCase)));
    }
}

然后将 DataGridColumn 的 SortMemberPath 设置为属性 YourSortOrder

<DataGridColumn x:Name="xxxxx"
                SortMemberPath="YourSortOrder" 
                ...etc...

【讨论】:

  • 我已经想到了这个想法。我怀疑的问题是性能。我在数据网格中有 6 列包含大量数据。数据网格中有数十万条记录。加载数据网格所花费的时间已经很长了。如果我们添加另一个 int 属性,那将降低性能。如果我错了,请纠正我
  • @senthilraja 这个特殊的属性不会以任何明显的方式减慢网格速度,但是每次需要设置该属性时都会受到一点影响。如果您可以对数据进行一点反规范化并在数据库中预先计算该 int 值,您将获得最佳性能。
  • @senthilraja 还要确保您使用的是启用了虚拟化的网格(因此 UI 元素只会针对可见的内容和视口之外的内容生成)。您应该能够将数百万条记录绑定到网格 - 但您可能需要注意一些事情,例如绑定错误、大量使用转换器、数据行过宽等。
  • 我用我的海量数据进行了测试。有用。谢谢斯拉格斯特。
猜你喜欢
  • 2023-02-06
  • 2012-07-02
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2021-03-30
  • 2014-12-21
相关资源
最近更新 更多