如何在更新其列时挂起DataGridView

时间:2011-01-10 18:15:47

标签: c# .net winforms datagridview

如何在更新其列时暂停.NET DataGridView显示任何内容?

这是我目前的代码。它工作正常,但在foreach循环中它很慢;你可以看到horiz滚动条在添加每列时缓慢增长。我自己构建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);

7 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可以尝试使用this帖子中的代码完全重绘。 parent将是dataGridView1的父级。

答案 4 :(得分: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
}

答案 5 :(得分:0)

显着提升绩效:

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

可能不是最终的高性能。

答案 6 :(得分:0)

这将加快 10 倍。

dataGridView1.Visible = false;
//Build/populate datagridview
dataGridView1.Visible = true;

这不是最专业的方法,但很有效。