还是说有更适合此目的的第三方控件吗?
还是说有更适合此目的的第三方控件吗?
简短回答:不要这样做!
详细回答:将FillWeight更改为10或更少(默认值为100)。您达到的限制是由于总FillWeight超过了64K x 100(谁知道为什么会有这个限制)。
使用虚拟列表(仅加载可见的行)。我不确定WinForms ListView是否具有虚拟模式,但WPF则有。
因此,请创建一个WPF用户控件并将其设置为VirtualMode = True,并在ElementHost容器上托管该用户控件以在WinForms客户端上运行。
很抱歉我无法提供更具体的信息,我手头没有代码。
Ryan
你错了,FillWeight变量需要一个浮点数而不是整数,所以0.5f或0.01f就可以了(后者理论上允许多达6553500列)。不幸的是,创建速度非常慢(至少对我来说,在1000列左右越来越慢;10000列大约需要20秒)。也许其他人建议的VirtualMode值得一试。
值得一提的是,这是我用来创建一个x乘y大小的空单元格表的代码。也许有人可以进一步优化速度:
private void createDGVcells(DataGridView dgv, int columns, int rows) {
// Optimization:
dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; // Massive speed up if high column count
dgv.ScrollBars = ScrollBars.None; // Apx. 75% speedup for high row count
dgv.AllowUserToAddRows = false; // Further 50% apx speedup when creating rows
dgv.ReadOnly = true; // Small apx. 50ms latency speedup?
// First clear any existing cells, should they exist:
if (dgv.DataSource != null) dgv.DataSource = null;
else {
dgv.Rows.Clear();
dgv.Columns.Clear();
}
// Create the first row (the columns):
DataGridViewColumn[] dgvc = new DataGridViewColumn[columns];
for (int i = 0; i < dgvc.Length; ++i) {
DataGridViewColumn dg = new DataGridViewTextBoxColumn();
dg.FillWeight = 0.1f; // Allows up to 655350 columns in theory
dgvc[i] = dg;
}
dgv.Columns.AddRange(dgvc);
// Add all the rows (very quick)
for (int j = 0; j < rows - 1; j++) dgv.Rows.Add();
// Optional to turn these back on
dgv.ReadOnly = false;
dgv.AllowUserToAddRows = true;
dgv.ScrollBars = ScrollBars.Both;
dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
}
Xceed的WPF数据网格可以轻松实现此功能,并使用列和UI虚拟化。请查看他们的在线演示。您可以使用尽可能多的列和行来填充演示以测试性能。http://xceed.com/Grid_WPF_Demo.html