我尝试过使用自定义的DataGrid以及WPF中的库存 . 我尝试过手动填充它们以及通过绑定 . 在这两种情况下,它们都很慢 .
我有一个场景,用户点击一个按钮,DataGrid会显示适当的数据 . 目前我在概念模式的证明,只使用样本数据 . 我有一个DataSet,其中包含10行 .
如果我单击按钮时没有将任何数据附加到DataGrid,则空DataGrid会立即显示,用户无法察觉延迟 . 一旦我添加10行数据,对于6列,延迟大约为2秒,对用户来说非常明显 .
我甚至尝试填充空数据,只是为了得到一个空网格,它同样慢 .
for (int i = 0; i < 10; i++)
_dataGrid.Items.Add("");
我设置了一个计时器来计算从单击按钮到执行所有代码以绘制DataGrid时的刻度,它大约是20毫秒,因此代码执行速度非常快,但在屏幕上是大滞后的地方 . . 我尝试了一个GridView,它在屏幕上渲染得非常快 .
我听过各种关于使用复杂场景和使用1000行的DataGrid绘制缓慢的报告,但这很简单,6列10行填充空数据 .
对于只读显示,GridView是DataGrid同样可行的选项吗?
更新
这是我的专栏的创建 .
DataGridTextColumn column = new DataGridTextColumn();
column.ColumnWidthChanged += new ColumnWidthChangedEventHandler(column_ColumnWidthChanged);
column.Header = entity.GetPropertyValue("ColumnLabel");
column.Binding = new Binding(entity.GetPropertyValue("Tag"));
column.Width = new DataGridLength(entity.GetPropertyDouble("DisplaySize"));
_dataGrid.Columns.Add(column);
这是我如何将DataSet绑定到其中的10行 .
_dataGrid.ItemsSource = ds.Tables[0].DefaultView;
_dataGrid.DataContext = ds.Tables[0];
不知道我能做些什么不同 .
9 回答
你有:
为网格启用
VirtualizingStackPanel.VirtualizationMode
?如果不是 - 尝试设置 .为DataGrid设置VirtualizingStackPanel.IsVirtualizing = "true"
StackPanel容器包装了一个网格?如果是 - 尝试删除 .
通过外部ScrollViewer控件包装网格?如果是 - 尝试删除 .
还有一点,您是否可以一次绑定整个项目集合,而不是将每个项目添加到grid.Items集合中?
DataGrid
性能问题的一般提示:我在使用DataGrid时遇到问题,在窗口调整大小,列排序等等之后花了几秒钟才刷新,并锁定了窗口UI(1000行,5列) ) .它归结为一个问题(bug?)与WPF大小计算 . 我把它放在一个带有
RowDefinition
Height="Auto"
的网格中,这导致渲染系统尝试通过测量每个列和行的大小来重新计算DataGrid的大小,可能是通过填充整个网格(据我所知) ) . 它应该以某种方式智能地处理它,但在这种情况下它不是 .快速检查以确定这是否是一个相关问题是在测试期间将DataGrid的
Height
和Width
属性设置为固定大小,然后再次尝试运行 . 如果您的性能已恢复,则可以在以下选项中进行永久性修复:将包含元素的大小更改为相对(*)或固定值
将DataGrid的
MaxHeight
和MaxWidth
设置为大于正常使用时的固定值尝试使用不同大小调整策略的其他容器类型(
Grid
,DockPanel
等)A blog我在Google上找到了一个解决方案 . 正如作者所说,我禁用了GroupStyle,解决了渲染速度问题 . 但我需要分组 . 作者说
添加到.NET 4.5 . 所以我把它设置为真 . 现在,通过分组可以快速渲染 . 问题是......滚动是生涩的 . 没有不可接受的生涩,但明显生涩 . 当我尝试创建扩展了2000个节点的TreeView时,我遇到了类似的问题 . 没有虚拟化,渲染速度很慢但滚动很顺利 . 通过虚拟化,渲染很快但滚动不稳定 .
为什么我们不能同时拥有......
在我的情况下,我遇到了DataGridCell ControlTemplate的问题,这减慢了渲染速度 .
请注意,在ReadOnly模式下使用 TextBlock (不是可选文本)或 TextBox 时,大数据集的相对加载速度非常不同:
Loading time 59 seconds:
Loading time 21 seconds:
Loading time 16 seconds:
好吧有点添加更多(我知道它非常古老的主题,但它仍然有助于某人)...
我试过了
对于DataGrid(
AutoGenerateColumns="True"
)绑定到DataTable.DefaultView()并且对速度没有影响,它对于Speed以及行之间的导航仍然很可怕 . 比,我想出了设置固定高度和宽度的解决方案DataGrid . 另外我也设定了这使我的页面填充速度非常快......而不是2分钟,现在几乎不需要10-12秒 .
希望它可以帮助某人 .
注意:我使用的是.Net 4.5
我有一个Surface Pro 3,我的数据网格,大约有200行和10列,在滚动,生涩和犹豫时非常慢 .
我认为这是网络,但事实上显卡无法跟上 - 等待它 - 对数据网格本身的阴影效果,即使控件的背景设置为纯色 .
我评论了效果,它的速度提高了4-5倍 .
希望这可以帮助 .
我对绑定数据网格有同样的问题,我注意到在第一次加载时它很快但在秒和下一步它很慢 . 所以当我添加代码时
DataGrid.ItemsSource = Nothing
然后TableAdapter.Fill(Mydataset.MyStoredProcedure,....) DataGrid.ItemsSource=Mydataset.MyStoredProcedure
它变得非常快我有1000行,5列的大问题,渲染时间为7-10秒,但在https://www.elegant-software.net/2014/05/performance-of-the-wpf-datagrid.html找到的解决方案立即使网格加载!
对我来说是:
我从样式中删除了这个,渲染变得很快 .