[英]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。
解决方案:
Application.DoEvents()
“魔术”调用。 <=有很多人说Application.DoEvents
是邪恶的,对此我可以投下反对票。
在.NET的早期,这个神奇的电话给我留下了深刻的印象。 该调用将暂停正在进行的任务(添加行),并执行待处理的UI内容,例如重新绘制UI,处理鼠标/键盘事件。 因此,UI可以保持响应状态,否则它将被冻结,直到完成冗长的任务。
因此,代码看起来像这样-当然,如注释中所述,每行调用一次将导致性能下降。
foreach (DataRow row in ds.Tables[0].Rows)
{
datagridView1.Rows.Add(row.ItemArray);
Application.DoEvents();
}
BeginInvoke
,它接受委托。 BeginInvoke
与直接在UI线程上执行循环之间的区别是BeginInvoke
是异步的。 这是一篇解释BeginInvoke
的文章 。 (哇,我没想到它自.NET 2.0以来(一个世纪前的时代)就已经可用)。
还是只使用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.