【问题标题】:WPF DataGrid custom sort: reorder items in ItemsSourceWPF DataGrid 自定义排序:重新排序 ItemsSource 中的项目
【发布时间】:2012-05-01 22:21:34
【问题描述】:

我有我的自定义网格,它继承自 DataGrid(来自 WPFToolkit),其中包含大约 10000 个项目。内置排序非常慢。因此,我编写了一个单独的类,该类为每列保留所有 DataRowView 项目的运行排序(这是有效的,因为从网格中添加和删除的情况非常少,如果有的话)。

网格具有AutoGenerateColumns='True' 并绑定到DataTableDefaultView

我覆盖OnSorting 以了解何时单击列标题并尝试用我的DataRowView 排序列表替换网格的ItemsSource。方法如下:

    private void RefreshItems()
    {
        if (_updating || _multiIndexer.Count == 0)
            return;

        try
        {
            _updating = true;
            this.AutoGenerateColumns = false;

            // replace the itemssource with my maintained and sorted list of 
            // DataRowView items
            this.ItemsSource = _multiIndexer.ToList();
        }
        finally
        {
            //this.AutoGenerateColumns = true;
            _updating = false;
        }
    }

问题是我破坏了自动生成中存在的列。此外,我只剩下与DataRowView 中的属性匹配的列。

我相信最好的方法是从我的DataRowView 排序列表中创建一个DataView 并将其传递给ItemsSource,但我还没有取得任何成功。

任何想法如何在不破坏自动生成的列的情况下将新的行列表传递给 ItemsSource 或 Items?手动生成我的所有列不是一种选择。

干杯, 肖恩

【问题讨论】:

    标签: wpf sorting datagrid datatable dataview


    【解决方案1】:

    我不知道摆脱重新创建列的方法。我遇到了类似的问题,通常我使用 ICollectionView 和 DeferRefresh。因为您不必在实际模型对象中执行此操作。但我不确定它是否适用于 DataViews 和 List 一样好。

    【讨论】:

      【解决方案2】:

      “非常慢”是什么意思?

      如果我采用数据网格并将具有 50000 行和 20 列的数据表绑定到它。对我来说似乎很快

      视图模型

      public class Viewmodel
      {
          public DataTable MyData { get; set; }
      
          public Viewmodel()
          {
              this.MyData = new DataTable();
      
              for (int i = 0; i < 20; i++)
              {
                  this.MyData.Columns.Add("Col" + i);
              }
      
              for (int i = 0; i < 50000; i++)
              {
                  var row = MyData.NewRow();
                  for (int j = 0; j < 20; j++)
                  {
      
                      row["Col" + j] = string.Format("{0} Row, Col {1}", i, j);
                  }
                  this.MyData.Rows.Add(row);
      
              }
          }
      }   
      

      窗口

          <DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="True">
      
          </DataGrid>
      

      编辑:它的 .net4.0

      【讨论】:

      • 一旦我们开始在两个方向上按多列排序,内置排序就会变得非常慢。我们选择的算法在构建要显示的数据行的排序列表时要快 4-10 倍(与网格完成自己的排序但不显示此列表所花费的时间相比......所以我仍然没有确定结果是否成立)。这就是为什么我需要在不破坏或重建列的情况下显示我拥有的数据行列表
      猜你喜欢
      • 2021-04-02
      • 2010-11-29
      • 2018-10-25
      • 1970-01-01
      • 2013-06-16
      • 2011-12-26
      • 2010-11-17
      • 2019-06-09
      • 1970-01-01
      相关资源
      最近更新 更多