web-dev-qa-db-ja.com

列の更新中にDataGridViewを一時停止する方法

列を更新している間、.NET DataGridViewが何かを表示しないようにするにはどうすればよいですか?

これが私の現在のコードです。正常に動作しますが、foreachループでは非常に遅くなります。各列が追加されるにつれて、水平スクロールバーがゆっくりと成長するのがわかります。さまざまな理由でdataGridView1.AutoGenerateColumnsを使用したくないので、自分でUI列を作成しています。

// 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);
14
Lane

グリッドを非常に効率的に更新するために、DataGridViewでVirtualModeを使用できます。この記事を参照してください: http://msdn.Microsoft.com/en-us/library/ms171622.aspx

私が覚えていることから、追加された新しい行ごとにUIに追加するのではなく、UIで何かを更新する前に、コレクション全体を更新するようです。

4
ferr

Addの代わりにAddRangeメソッドの使用を検討することをお勧めします。それらをすべて一度に追加すると、データグリッドの動作が少し良くなります。

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);
4
Conrad Frix

私の場合、一時停止と再開のレイアウトは機能しませんでした。 dataGridViewを無効にすることを解決しました(dgv.Enabled = false)更新して再度有効にする前に(dgv.Enabled = true)更新プロセスの最後。

3
Zac

this postのコードを使用して、完全に再描画されないようにすることができます。 parentdataGridView1の親になります。

1
SwDevMan81

タイマーを使用している場合は、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
Marco Pardo

パフォーマンスの大幅な向上:

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

究極の高性能ではないかもしれません。

0
coarist