C# 将数千列添加到datagridview中
我试图向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
大小
值-当它小于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有哪些优点/缺点?