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

3

还是说有更适合此目的的第三方控件吗?


13
你希望超过65,535列的内容可以被人类读懂吗? - annakata
2
我真的很难想到一些有效的理由去这样做... - Hemant
7
我会检查应用程序的设计,而不是寻找支持它的数据网格视图... - fretje
1
我需要显示网格的顶点,顶点数量在极少数情况下可能非常高。 - nullDev
4
如果您正在显示网格,您可能会考虑使用图形库代替... 网格速度较慢。我无法想象具有65k+列的网格会有多糟糕。 - Michael Haren
显示剩余2条评论
5个回答

9
我知道DevExpress XtraGrid理论上支持在网格中显示Int32.MaxValue行或列。 在这种情况下,限制是系统内存而不是网格本身。
但是,您真的需要显示这么多数据吗?

2

简短回答:不要这样做!

详细回答:将FillWeight更改为10或更少(默认值为100)。您达到的限制是由于总FillWeight超过了64K x 100(谁知道为什么会有这个限制)。


1
如果您保留默认的FillWeight,那么列限制大约为655,因为ColumnCount x FillWeight < 65535!因此,即使您将FillWeight更改为最小值1,最大列数也将是65,535。 - nullDev
啊,我好像忘了!谢谢。 - leppie

2

使用虚拟列表(仅加载可见的行)。我不确定WinForms ListView是否具有虚拟模式,但WPF则有。

因此,请创建一个WPF用户控件并将其设置为VirtualMode = True,并在ElementHost容器上托管该用户控件以在WinForms客户端上运行。

很抱歉我无法提供更具体的信息,我手头没有代码。

Ryan


1

你错了,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;
}   

0

Xceed的WPF数据网格可以轻松实现此功能,并使用列和UI虚拟化。请查看他们的在线演示。您可以使用尽可能多的列和行来填充演示以测试性能。http://xceed.com/Grid_WPF_Demo.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接