如何在更新其列时挂起DataGridView

在更新其列时,如何暂停.NET 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); 

您可以将VirtualMode与DataGridView一起使用,以便非常有效地更新网格。 请参阅此文章: http : //msdn.microsoft.com/en-us/library/ms171622.aspx

根据我的记忆,它似乎在更新UI上的任何内容之前更新整个集合,而不是添加到每个新行添加的UI /等。

您可能需要考虑使用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); 

在我的情况下,暂停和恢复布局不起作用。 我解决了在更新之前禁用dataGridView( dgv.Enabled = false )并在更新过程结束时重新启用它( dgv.Enabled = true )。

你可以试着通过使用这篇文章中的代码来防止它完全重绘。 parent将是dataGridView1的父级。

如果您正在使用计时器,请使用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 } 

显着的性能提升:

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

可能不是最终的高性能。