我正在尝试将数据集中的大数据(大约230,000行x 16列)分配到winform中的datagridview,并且需要很长时间才能在datagridview中加载。
在网上搜索这个问题之后,我找到了两个解决方案来加速加载过程,一个使用virtualmode进行datagridview,另一个解决方案是直接将数据集分配给datagridview数据源。
两种解决方案都在工作但仍需要很长时间,因为第一种解决方案需要大约15分钟才能完成,而第二种解决方案需要大约30分钟。
所以我在下面列出了两个解决方案,以便检查我没有错过任何内容,或者可能还有其他解决方案可以解决这个问题。
第一个解决方案
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];
}
提前致谢。
答案 0 :(得分:1)
我不认为有人滚动并从这个大尺寸数据中找到一行.. 您应该只为数据网格分配前100或500个值,并使用文本框或其他任何内容为其他人提供搜索选项。
答案 1 :(得分:0)
VirtualMode本身就很快。这里我有一个示例视频,显示了包含9百多万行的VirtualMode(Northwind Customers表复制了N次):
表单的初始加载大约需要8秒,从那里开始它很快。
恕我直言,你加载的数据集本身很慢。您不应该一次加载整个数据,这就是使用VirtualMode等方法的关键。不幸的是,DataSet诞生了一种缓慢的技术。你应该克服这一行的缓慢:
DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());
如果您共享ACC_Data.Get_DT()代码,那么我们可能会有更快加载的建议(即使直接加载具有230K行的DataSet,15分钟也非常慢)。
PS:我在这里发布了该视频的代码:
答案 2 :(得分:0)
感谢@ASh,我只需添加一个虚拟表并将其绑定到datagridview,如下面的代码所示,并在大约20秒内加载数据。
private void Form1_Load(object sender, EventArgs e)
{
DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());
var t = new DataTable();
for (int c = 0; c < DSg.Tables[0].Columns.Count; c++) t.Columns.Add();
for (int r = 0; r < DSg.Tables[0].Rows.Count; r++)
{
string[] Dr = new string[DSg.Tables[0].Columns.Count];
int i = 0;
foreach (DataColumn C in DSg.Tables[0].Columns)
{
Dr[i] = DSg.Tables[0].Rows[r][C].ToString();
i++;
}
var row = t.Rows.Add(Dr);
}
dataGridView1.DataSource = t;
}