将数千列添加到datagridview中

时间:2012-02-27 16:24:22

标签: c# winforms datagridview

我正在尝试将大量列添加到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];
        }
    }

2 个答案:

答案 0 :(得分:2)

我添加了这段代码:

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_Scroll处理程序以在单元格中显示相关数据。

答案 1 :(得分:0)

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

  

“分页是限制显示的数据量的好方法   用户一次,但也是阻止大量数据的好方法   通过网络传输,被保存在内存或大   查询数据库......它解决了许多问题。

     

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

     

另一种方法是让它看起来实际上只有一个大清单   在幕后的页面,所以用户感觉他们实际上   查看一个大清单。您可以在TFS中看到这样做的示例。   您可以使用Windows窗体数据网格(DataGridView)执行此操作。