在数据网格视图中添加数千列

本文关键字:千列 添加 数据网 数据 网格 视图 | 更新日期: 2023-09-27 18:25:53

我试图在datagridview中添加大量列,但我遇到了一个具有挑战性的问题。当列数变得太大时,下面的代码添加列的速度非常慢。这取决于size的值-当它小于10000时,我会得到或多或少的好结果(2-4秒来添加这个列数),但当大小增长到15000或更多时,添加时间根本不成比例,对于30000列,它可以达到2分钟,而不是我预期的20-30秒。所以我的问题是,有可能以某种方式优化这个程序吗?

datagridview.SuspendLayout();
int size = 10000;
var columns = new DataGridViewColumn[size];
for (int i = 0; i < size; i++)
            {
                columns[i] = new DataGridViewTextBoxColumn();
                columns[i].Name = "col" + i;
                columns[i].HeaderText = "col" + i;
                columns[i].FillWeight = 0.00001f;
            }
datagridview.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
Array.ForEach(columns, item => datagridview.Columns.Add(item));
datagridview.ResumeLayout();

这就是我所做的:

    int visibleColumns = 20;
    string[] headers;
    DataGridViewColumn[] columns;
    HScrollBar hbar = new HScrollBar();
public Constructor(){
    ...
    int sizeDezired = 15000;
    int size = Math.Min(sizeDezired, visibleColumns);
    columns = new DataGridViewColumn[size];
    headers = new string[sizeDezired];
    for (int i = 0; i < size; i++)
    {
        columns[i] = new DataGridViewTextBoxColumn();
        columns[i].Name = "col" + i;
        columns[i].HeaderText = "col" + i;
        columns[i].FillWeight = 0.00001f;
    }
    for (int i = 0; i < sizeDezired;i++ )
    {
        headers[i] = "col" + i;
    }
    if (sizeDezired > size)
    {
        hbar.Maximum = sizeDezired - size;
        hbar.Minimum = 0;
        hbar.Value = 0;
    }
    hbar.Scroll += hbar_Scroll;
    ...
}
    void hbar_Scroll(object sender, ScrollEventArgs e)
    {
        for (int i = 0; i < datagridview.ColumnCount; i++)
        {
            datagridview.Columns[i].HeaderText = headers[i + e.NewValue];
        }
    }

在数据网格视图中添加数千列

我添加了以下代码:

int visibleColumns = 20;// columns that are in data grid view
string[] headers;// headers for all desired columns 
DataGridViewColumn[] columns;
HScrollBar hbar = new HScrollBar();
public Constructor(){
    ...
    int sizeDesired = 15000;
    int size = Math.Min(sizeDesired, visibleColumns);
    columns = new DataGridViewColumn[size];
    headers = new string[sizeDesired];
    for (int i = 0; i < size; i++)
    {
        columns[i] = new DataGridViewTextBoxColumn();
        columns[i].Name = "col" + i;
        columns[i].HeaderText = "col" + i;
        columns[i].FillWeight = 0.00001f;
    }
    for (int i = 0; i < sizeDesired;i++ )
    {
        headers[i] = "col" + i;
    }
    if (sizeDesired > size)
    {
        hbar.Maximum = sizeDesired - size;
        hbar.Minimum = 0;
        hbar.Value = 0;
    }
    hbar.Scroll += hbar_Scroll;
    ...
}
void hbar_Scroll(object sender, ScrollEventArgs e)
{
    for (int i = 0; i < datagridview.ColumnCount; i++)
    {
        datagridview.Columns[i].HeaderText = headers[i + e.NewValue];
    }
}

这里添加了水平滚动条来循环浏览所有不可见的列,并移动列标题以在视觉上"滚动"浏览所有列(本例中为15000),但实际上只有20列。此代码不使用任何数据绑定,只有标头在更改,因此您需要修改hbar_Soll处理程序以在单元格中显示相关数据。

您正在寻找的技术称为分页。查看以下参考

"分页是限制显示到用户,但也是一种很好的停止大量数据的方法通过网络传输,保存在内存中或大对数据库的查询。。。它解决了许多问题。

最常见的解决方案是(就像在谷歌搜索中一样)显示了页面列表,您可以浏览页面一次向上/向下翻页或单击页码。

另一种方法是让人觉得实际上有一个大名单,但页面,让用户感觉他们实际上查看一个大列表。您可以在TFS中看到这样做的一个示例。您可以使用windows窗体数据网格(DataGridView)来完成此操作。