或者是否有更好的第三方控制用于此目的?
答案 0 :(得分:9)
我知道DevExpress XtraGrid理论上支持网格中的Int32.MaxValue行或列。在这种情况下,限制是系统内存而不是网格。
但你真的需要显示如此多的数据吗?
答案 1 :(得分:2)
简短的回答:不要这样做!
答案很长:将FillWeight更改为10或更低(默认值为100)。您达到的限制是由于总FillWeight超过64K x 100(谁知道为什么这是一个限制)。
答案 2 :(得分:2)
使用虚拟列表(仅加载可见的行)。我不确定WinForms ListView是否具有虚拟模式,但WPF具有虚拟模式。
因此,创建一个WPF用户控件并将其设置为VirtualMode = True,并使用ElementHost容器在WinForms客户端上托管该用户控件。
抱歉,我不能更具体,我没有代码可以提供。
赖安
答案 3 :(得分:1)
你错过了FillWeight变量的浮点数不是整数,所以0.5f或0.01f就可以了(理论上后者最多允许6553500列)。不幸的是,创作非常缓慢(至少对我来说,越来越多的列已经超过1000列; 10,000列需要大约20秒)。也许其他人建议的VirtualMode值得一试。
对于它的价值,这里是我用来创建一个x大小的空单元格表的代码。也许有人可以进一步优化速度:
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;
}
答案 4 :(得分:0)
Xceed的WPF DataGrid可以轻松完成此任务并使用列和UI虚拟化。看看他们的现场演示。您可以使用测试perf所需的尽可能多的列和行来填充演示。 http://xceed.com/Grid_WPF_Demo.html