[英]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.