-1

我目前正在使用DataGrid。约有24列是在C#中动态创建的。Datagrid性能非常低,即使使用UI虚拟化

在我的DataGrid中总是有大约300个条目(因为一个条目代表一个“标题”,我不能创建分页系统,因为我必须获取同一页面中的所有数据)。

它运行良好,但如果我使用DataGridTemplateColumn(因为我需要一个带有分隔符和2个标题的样式化列标题,因为我需要每列有2个子列)和单元格模板(仍然是因为我需要这些2个子列),它有一个双绑定(每个子列一个绑定),当我加载网格,它只是无法使用...

我试过所有类型的虚拟化(StackPanel,RowVirtualization,ColumnVirtualization与所有不同价值组合的类型)。 我可以得到的“最佳”性能是将RowVirtualization和ColumnVirtualization设置为True。

它现在“可用”,但仍当我做水平滚动很慢(即使有一点点图形臭虫,因为我用的是FrozenColumn ...)

我甚至用我自己的ListView/GridView的审判,经过几个小时的工作(为了重现冻结的柱子等等),仍然有相同的“问题”。

不可能使用数据虚拟化(因为“只有”有285列的24列,它根本不会用户友好)。

谢谢!

EDIT 1:这里是码生成

 ColumnCollection = new ObservableCollection<DataGridColumn>(); 
     DataGridTemplateColumn firstDtc_l = new DataGridTemplateColumn(); 
     firstDtc_l.Header = "Titles"; 
     FrameworkElementFactory spFactory_l = new FrameworkElementFactory(typeof(Grid)); 
     ColumnCollection.Add(firstDtc_l); 
     int i = 0; 

     foreach (string s in DynamicColumns) 
     { 
      DataGridTemplateColumn dtc_l = new DataGridTemplateColumn(); 
      Binding bindColor = new Binding(); 
      bindColor.Converter = new ChangedColorConverter(); 
      bindColor.ConverterParameter = "Column" + i; 

      //DataTemplate 
      DataTemplate dt_l = new DataTemplate("MyObject"); 
      spFactory_l = new FrameworkElementFactory(typeof(Grid)); 
      spFactory_l.Name = "CellTemplate"; 
      FrameworkElementFactory columnDefinition1 = new FrameworkElementFactory(typeof(ColumnDefinition)); 
      FrameworkElementFactory columnDefinition2 = new FrameworkElementFactory(typeof(ColumnDefinition)); 
      FrameworkElementFactory border1 = new FrameworkElementFactory(typeof(Border)); 
      border1.SetValue(Grid.ColumnProperty, 0); 
      border1.SetValue(Border.BorderBrushProperty, Brushes.Gray); 
      border1.SetValue(Border.BorderThicknessProperty, new Thickness(0,0,0,0)); 
      FrameworkElementFactory border2 = new FrameworkElementFactory(typeof(Border)); 
      border2.SetValue(Grid.ColumnProperty, 1); 
      border2.SetValue(Border.BorderBrushProperty, Brushes.Gray); 
      border2.SetValue(Border.BorderThicknessProperty, new Thickness(1, 0, 0, 0)); 
      FrameworkElementFactory textBlock1 = new FrameworkElementFactory(typeof(TextBlock)); 
      textBlock1.SetValue(Grid.ColumnProperty, 0); 
      textBlock1.SetValue(TextBlock.ForegroundProperty, bindColor); 
      Binding firstBind = new Binding("MyObject[Column"+i+"].FirstBinding"); 
      textBlock1.SetValue(TextBlock.TextProperty, localBind); 
      FrameworkElementFactory textBlock2 = new FrameworkElementFactory(typeof(TextBlock)); 
      Binding secongBind = new Binding("MyObject[Column" + i + "].SecondBinding"); 
      textBlock2.SetValue(Grid.ColumnProperty, 0); 
      textBlock2.SetValue(TextBlock.TextProperty, firstBind) 
      textBlock2.SetValue(TextBlock.ForegroundProperty, secongBind); 
      border1.AppendChild(textBlock1); 
      border2.AppendChild(textBlock2); 

      spFactory_l.AppendChild(columnDefinition1); 
      spFactory_l.AppendChild(columnDefinition2); 
      spFactory_l.AppendChild(border1); 
      spFactory_l.AppendChild(border2); 
      dt_l.VisualTree = spFactory_l; 

      dtc_l.Width = DataGridLength.Auto; 
      dtc_l.CellTemplate = dt_l; 
      dtc_l.Header = s; 
      ColumnCollection.Add(dtc_l); 
      i++; 
     } 

DataGrid绑定到 “TheObject” 的集合的列。 TheObject类具有public Dictionary<string, MyCell> MyObject { get; set; } MyCell类具有FirstBinding和SecondBinding属性(字符串)。

+0

怎么没有你DataGridTemplateColumn的表现?也许你应该为此发布代码。 – blindmeis 2011-05-20 07:59:05

+0

我知道低性能是因为DataGridTemplaceColumns ...但我不能使用另一种类型的列,因为我必须有一个Styled Header(不仅仅是一个字符串作为头)和单元模板(每个绑定2个cell):/ – metalcam 2011-05-20 08:07:01

+0

你可以发布你的代码/ xaml的TemplateColumn? – blindmeis 2011-05-20 08:13:34

回答

-1

我有一个DataGrid类似的问题,它在窗口大小调整,列排序等操作后花费了几秒的时间来刷新,并锁定了窗口UI(1000行,5列)。

它回到了一个问题(错误?)与WPF大小计算。我把它放在一个RowDefinition Height =“Auto”的网格中,通过测量每一列和每一行的大小,导致渲染系统试图在运行时重新计算DataGrid的大小,大概是通过填充整个网格据我所知)。它应该以某种方式智能处理,但在这种情况下不是。

快速检查这是否是相关问题,是在测试期间将DataGrid的高度和宽度属性设置为固定大小,然后再次运行。一旦恢复性能,永久修复可以是这些选项中选择:

  • 变化的含元件的尺寸可相(*)或 固定值
  • 集MaxHeight和数据网格到的MaxWidth固定值大 比它可能在正常使用
  • 尝试用不同的大小调整战略的另一个容器类型得到(电网,DockPanel中,等)