2011-01-10 41 views
14

如何在更新列時暫停.NET DataGridView顯示任何內容?如何在更新列時掛起DataGridView

這是我目前的代碼。它工作正常,但在foreach循環中非常慢;您可以看到每增加一列,水平滾動條就會慢慢增長。我自己構建UI列,因爲我不想使用dataGridView1.AutoGenerateColumns出於各種原因。

// Disconnect and reset DataGridView 
dataGridView1.DataSource = null; 
dataGridView1.SuspendLayout(); 
dataGridView1.Columns.Clear(); 

// Get data from SQL 
DataTable dt = new DataTable(); 
SqlDataAdapter adapter = new SqlDataAdapter("select * from employeehist", conn); 
adapter.Fill(dt); 

// Build DataGridView columns 
foreach (DataColumn c in dt.Columns) 
{ 
    DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn(); 
    col.SortMode = DataGridViewColumnSortMode.NotSortable; 
    col.DataPropertyName = c.ColumnName; 
    col.HeaderText = c.Caption; 
    dataGridView1.Columns.Add(col); 
} 

// Reconnect DataGridView 
dataGridView1.DataSource = dt; 
dataGridView1.ResumeLayout(true); 
+0

嗯。應該這樣做...嘗試在SuspendLayout調用後放置'dataGridView1.DataSource = null'?你期望列在兩個請求之間改變嗎?如果不是,您可能想要完全從該方法中刪除列創建。 –

+0

是的,列數可以改變。查詢的結果集可以根據用戶選擇的日期範圍而有所不同。另外,試着移動'= null',但它沒有幫助。謝謝 – Lane

+0

@Lane,我有同樣的問題,但不是datagridview。我正在使用GridView來綁定數據,並且在循環過程中,它非常慢,GridView沒有Columns.AddRange函數......想知道爲什麼以及如何修復您的案例?謝謝。 – Princa

回答

3

您可以使用VirtualMode和DataGridView來非常有效地更新網格。看到這篇文章:http://msdn.microsoft.com/en-us/library/ms171622.aspx

從我記得,它似乎更新之前更新UI上的任何東西,而不是添加到每個新行添加/ etc的UI的集合。

+0

這是一個演練:http://msdn.microsoft.com/en-us/library/15a31akc.aspx它需要更多的工作來設置它,但實施後應該快得多。 – ferr

2

您可能需要考慮使用AddRange方法而不是Add。當您將它們一次全部添加時,數據網格會更好一些。

DataGridViewColumn[] columns = new DataGridViewColumn[dt.Columns.Count]; 

for (int i = 0; i < dt.Columns.Count; i++) 
{ 
    DataColumn c = dt.Columns[i]; 
    DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn(); 
    col.SortMode = DataGridViewColumnSortMode.NotSortable; 
    col.DataPropertyName = c.ColumnName; 
    col.HeaderText = c.Caption; 

    columns[i] = col; 
} 


dataGridView1.Columns.AddRange(columns); 
+1

好主意,但我仍然有相同的確切滯後。它滯後於一行:dataGridView1.Columns.AddRange(columns); – Lane

+1

還要確保你在開頭使用insert:'dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersSizeMode.DisableResizing;'否則,這會降低速度。 –

1

您可以嘗試使用this後的代碼完全重新繪製。 parent將是dataGridView1的母公司。

+1

哇從來沒有想過使用SendMessage。 –

+2

我試過這個,但它並不奇怪。繪圖顯然已暫停,但我同時計時。感覺像DataGridView仍然繪製在繪圖已被暫停或不是。 – Lane

2

在我的情況下,暫停和恢復佈局不起作用。我決定在更新之前禁用dataGridView(dgv.Enabled = false),並在更新過程結束時重新啓用它(dgv.Enabled = true)。

+0

另一個有用的方法可以在這裏找到:http://stackoverflow.com/questions/1550293/stopping-textbox-flicker-during-update 尋找LockWindowUpdate ... – mike

0

如果您使用計時器,則使用SynchronizingObject。 這完全消除了我的閃爍。

var dgv = new DataGridView(); 
System.Timers.Timer timer = new System.Timers.Timer(); 
timer.Interval = 1000; 
timer.SynchronizingObject = dgv; // syncronise 
timer.Start(); 
timer.Elapsed += Timer_Elapsed; 
void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    refreshDGV(); // in here I refresh the DataGridView 
} 
0

顯着提高性能:

var dgv = new DataGridView(); 
dgv.SuspendLayout(); 
// Do update, change values 
dgv.ResumeLayout(); 

可能不是最終的高性能。