【发布时间】:2015-10-27 11:09:49
【问题描述】:
我正在尝试将大数据(大约 230,000 行 x 16 列)从数据集分配给 winform 中的 datagridview,并且在 datagridview 中加载需要很长时间。
在网上搜索了这个问题后,我找到了两种加快加载过程的解决方案,一种使用虚拟模式用于 datagridview,另一种解决方案是直接将数据集分配给 datagridview 数据源。
两个解决方案都有效,但仍然需要很长时间,因为第一个解决方案大约需要 15 分钟才能完成,而第二个解决方案大约需要 30 分钟。
所以我在下面列出了 2 个解决方案,以检查我没有遗漏任何内容,或者是否有针对此问题的其他解决方案。
第一种解决方案
public Form1()
{
InitializeComponent();
this.dataGridView1.Dock = DockStyle.Fill;
this.Controls.Add(this.dataGridView1);
this.Load += new EventHandler(Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
this.dataGridView1.VirtualMode = true;
this.dataGridView1.CellValueNeeded += new
DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);
DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());
for (int i = 0; i < DSg.Tables[0].Columns.Count; i++)
{
this.dataGridView1.Columns.Add(DSg.Tables[0].Columns[i].ColumnName, DSg.Tables[0].Columns[i].Caption);
}
this.dataGridView1.RowCount = DSg.Tables[0].Rows.Count;
}
private void dataGridView1_CellValueNeeded(object sender,
System.Windows.Forms.DataGridViewCellValueEventArgs e)
{
if (e.RowIndex == this.dataGridView1.RowCount - 2 && e.ColumnIndex == 0)
{
return;
}
e.Value = DSg.Tables[0].Rows[e.RowIndex][e.ColumnIndex];
}
第二个解决方案
public Form1()
{
InitializeComponent();
this.dataGridView1.Dock = DockStyle.Fill;
this.Controls.Add(this.dataGridView1);
this.Load += new EventHandler(Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());
this.dataGridView1.DataSource = DSg.Tables[0];
}
提前致谢。
【问题讨论】:
-
你确定是DataGridView,它很慢,而且首先没有在DataSet中获取数据?
-
是的,我很确定。 :D
-
问题是:为什么要在
DataGridView中加载230K 行?在最可能的情况下,用户只能看到 20-50 行。你能指望什么?用户点击向下滚动按钮超过 5K 次?!将更少量的数据加载到 DataGridView 中不是更明智的做法吗?例如:允许用户搜索整个数据库;当目标位于第 50000 行时,您可以从第 40000 到第 60000 加载到 DataGridView 行。即使达到顶部/底部,您也可能会自动重新加载更多行... -
...您没有看到大多数现代网站加载大量数据的行为吗?例如:twitter.com。当用户向下/向上滚动时会加载更多数据,否则它们会非常慢。
-
虚拟表的绑定对我来说只需几秒钟:
var t = new DataTable(); for (int c = 0; c < 16; c++) t.Columns.Add(); for (int r = 0; r < 230000; r++) { var row = t.Rows.Add(r, r, r, r); row[10] = r; } dataGridView1.DataSource = t;
标签: c# data-binding datagridview