Как приостановить DataGridView при обновлении его столбцов - PullRequest
14 голосов
/ 10 января 2011

Как я могу приостановить .NET DataGridView от отображения чего-либо, пока я обновляю его столбцы?

Вот мой текущий код.Это работает хорошо, но это очень медленно в цикле foreach;Вы можете видеть, как полоса прокрутки горизонта медленно растет по мере добавления каждого столбца.Я сам строю столбцы пользовательского интерфейса, так как не хочу использовать 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);

Ответы [ 6 ]

4 голосов
/ 10 января 2011

Вы можете использовать VirtualMode с DataGridView для очень эффективного обновления сетки.См. Эту статью: http://msdn.microsoft.com/en-us/library/ms171622.aspx

Из того, что я помню, кажется, что перед обновлением чего-либо в пользовательском интерфейсе обновляется вся коллекция, в отличие от добавления в пользовательский интерфейс для каждой новой добавленной строки / и т.д.

3 голосов
/ 10 января 2011

Возможно, вы захотите использовать метод 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 голосов
/ 22 января 2016

В моем случае приостановить и возобновить макет не сработало. Я решил отключить dataGridView (dgv.Enabled = false) перед обновлением и снова включить его (dgv.Enabled = true) в конце процесса обновления.

1 голос
/ 10 января 2011

Вы можете попытаться предотвратить перерисовку, используя код в этом посте.parent будет родителем dataGridView1.

0 голосов
/ 09 января 2018

Значительное увеличение производительности:

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

Не может быть максимальной производительности.

0 голосов
/ 01 декабря 2017

Если вы используете таймер, используйте 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...