如何在更新其列时挂起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();
可能不是最终的高性能。