代码之家  ›  专栏  ›  技术社区  ›  nullDev

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

  •  3
  • nullDev  · 技术社区  · 17 年前

    5 回复  |  直到 17 年前
        1
  •  9
  •   Francis B.    17 年前

    我知道 DevExpress XtraGrid 理论上支持网格中的Int32.MaxValue行或列。在这种情况下,限制是系统内存,而不是网格。

    但你真的需要显示这么多数据吗?

        2
  •  2
  •   leppie    17 年前

    简短的回答:不要这样做!

        3
  •  2
  •   Ryan O'Neill    17 年前

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

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

    瑞安

        4
  •  1
  •   Dan W    11 年前

    您没有注意到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;
    }   
    
        5
  •  0
  •   Charles Charles    17 年前

    Xceed的WPF DataGrid可以很容易地做到这一点,并使用列和UI虚拟化。看看他们的现场演示。您可以用测试性能所需的尽可能多的列和行填充演示。 http://xceed.com/Grid_WPF_Demo.html

    推荐文章