在数据网格视图中添加数千列
本文关键字:千列 添加 数据网 数据 网格 视图 | 更新日期: 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)来完成此操作。