如何在C#windows应用程序的数据网格视图中添加超过65,535列?

时间:2009-07-01 12:47:19

标签: c# winforms datagridview

或者是否有更好的第三方控制用于此目的?

5 个答案:

答案 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