繁体   English   中英

在datagridview中添加新行后,立即显示它

[英]After adding a new row in datagridview, display it immediately

我有一个datagridview。 当我以编程方式添加新行时,它应该立即出现在datagridview上,而不是等待完成我拥有的所有行。

我正在使用以下解决方案

...
adapter.Fill(ds);
foreach (DataColumn dc in ds.Tables[0].Columns)
{
    datagridView1.Columns.Add(dc.ColumnName, dc.ColumnName);
}
foreach (DataRow row in ds.Tables[0].Rows)
{
    datagridView1.Rows.Add(row.ItemArray);
}
...

在此解决方案上,我必须等待ds.Tables[0].Rows完成,然后datagridview显示这些行。

我在寻求解决方案或建议,可以在datagridview上看到活动行,类似于执行查询后在SQL Server上的结果。

未立即添加行的原因是UI线程正忙于执行循环,因此在循环未完成时没有机会重新绘制UI。

解决方案:

  1. 旧的Application.DoEvents() “魔术”调用。

<=有很多人说Application.DoEvents是邪恶的,对此我可以投下反对票。

在.NET的早期,这个神奇的电话给我留下了深刻的印象。 该调用将暂停正在进行的任务(添加行),并执行待处理的UI内容,例如重新绘制UI,处理鼠标/键盘事件。 因此,UI可以保持响应状态,否则它将被冻结,直到完成冗长的任务。

因此,代码看起来像这样-当然,如注释中所述,每行调用一次将导致性能下降。

foreach (DataRow row in ds.Tables[0].Rows)
{
    datagridView1.Rows.Add(row.ItemArray);
    Application.DoEvents(); 
}
  1. 使用BeginInvoke ,它接受委托。

BeginInvoke与直接在UI线程上执行循环之间的区别是BeginInvoke是异步的。 这是一篇解释BeginInvoke 的文章 (哇,我没想到它自.NET 2.0以来(一个世纪前的时代)就已经可用)。

这是一个使用BeginInvoke将行添加到DataGridView的示例

还是只使用Databind?

private DataTable Dt = new DataTable();
dataGridView1.DataSource = Dt;
//do what ever
DataRow dataRow = Dt.NewRow();
//add data here to data row
Dt.Rows.Add(dataRow);

虽然这不会解决你与你的GUI锁定的问题,我建议您阅读

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM