簡體   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