C# 将数千列添加到datagridview中

C# 将数千列添加到datagridview中,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图向datagridview中添加大量列,但我遇到了一个具有挑战性的问题。当列计数变得太大时,下面的代码会非常缓慢地添加列。这取决于大小值-当它小于10000时,我会得到或多或少的好结果(添加此数量的列需要2-4秒),但当大小增加到15000或更大时,添加时间根本不成比例,对于30000个列,它可以达到2分钟,而不是我预期的20-30秒。所以我的问题是,是否有可能以某种方式优化这个过程 datagridview.SuspendLayout(); int size = 10000; var c

我试图向datagridview中添加大量列,但我遇到了一个具有挑战性的问题。当列计数变得太大时,下面的代码会非常缓慢地添加列。这取决于
大小
值-当它小于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();
datagridview.SuspendLayout();
int size=10000;
var columns=新的DataGridViewColumn[size];
对于(int i=0;idatagridview.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;
字符串[]头;
DataGridViewColumn[]列;
HScrollBar hbar=新的HScrollBar();
公共构造函数(){
...
int sizeDezired=15000;
int size=Math.Min(sizedzired,visibleColumns);
columns=新的DataGridViewColumn[大小];
headers=新字符串[sizedzired];
对于(int i=0;i大小)
{
hbar.Maximum=sizeDezired-大小;
hbar.最小值=0;
hbar.Value=0;
}
hbar.Scroll+=hbar\u Scroll;
...
}
无效hbar\u滚动(对象发送器,滚动事件参数e)
{
对于(int i=0;i
您正在寻找的技术称为分页。看看下面的例子

“分页是限制显示给用户的数据量的一种好方法 用户在同一时间,但也是一个非常好的方式停止大量的数据 通过网络传输、存储在内存中或大容量 查询数据库…它解决了许多问题

最常见的解决方案是(就像在谷歌搜索中一样)你得到 显示了一个页面列表,您可以在页面之间导航 一次上/下一页或单击页码

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

我添加了以下代码:

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];
    }
}
int visibleColumns=20;//数据网格视图中的列
字符串[]头;//所有所需列的头
DataGridViewColumn[]列;
HScrollBar hbar=新的HScrollBar();
公共构造函数(){
...
int sizeDesired=15000;
int size=Math.Min(sizeDesired,visibleColumns);
columns=新的DataGridViewColumn[大小];
headers=新字符串[sizeDesired];
对于(int i=0;isize)
{
hbar.Maximum=sizeDesired-所需大小;
hbar.最小值=0;
hbar.Value=0;
}
hbar.Scroll+=hbar\u Scroll;
...
}
无效hbar\u滚动(对象发送器,滚动事件参数e)
{
对于(int i=0;i

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

请不要在标题前加上“C”“等等。这就是标记的用途。在此期间内存使用情况如何?我很想知道为什么您希望网格中有这么多列。问题是您试图将太多数据加载到UI中。没有人能一次理解那么多数据。我建议与客户/最终用户合作,确定他们的实际需求和期望。围绕这一点设计UI。如果他们说他们需要一切,比他们不知道他们需要什么,或者他们需要多个组件,其中每个组件预成一个特定的任务。如果它是某种日历,你应该考虑创建不同的视图,如Outlook(月、周、日),并且只显示有限的时间段,否则它可能变得无用。你打败了我;我得到了几乎完全相同的答案。需要指出的一点是,如果有非常多的行,这种技术将很好地与VirtualMode配合使用。是否有可能将其更新为处理“无限”行?顺便问一下,与此技术相比,VirtualMode有哪些优点/缺点?