C#
パターン3:列を完全に作り直す(複数の異なるテーブルを切り替えたい時)
出典: C# DataGridView の DataSource を後から変更する全パターン — 最短対処:コピペで動く3つの差し替えパターン / パターン3:列を完全に作り直す(複数の異なるテーブルを切り替えたい時)
private void SwitchToInventory(DataTable dt)
{
dgv.DataSource = null;
dgv.Columns.Clear();
dgv.AutoGenerateColumns = false;
dgv.Columns.Add(new DataGridViewTextBoxColumn
{
Name = "colDate",
HeaderText = "日付",
DataPropertyName = "date",
Width = 100,
});
dgv.Columns.Add(new DataGridViewTextBoxColumn
{
Name = "colQty",
HeaderText = "在庫数",
DataPropertyName = "qty",
DefaultCellStyle = { Format = "N0", Alignment = DataGridViewContentAlignment.MiddleRight },
Width = 80,
});
dgv.DataSource = dt;
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「最短対処:コピペで動く3つの差し替えパターン / パターン3:列を完全に作り直す(複数の異なるテーブルを切り替えたい時)」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
8 件// NGパターン:AutoGenerateColumns=true のまま差し替える dgv.DataSource = dt1; // 列が3個(ID/名前/金額)追加される dgv.DataSource = dt2; // 列がさらに3個(ID/コード/数量)追加される ← 重複や増殖未収録
パターン1: AutoGenerateColumnsがtrueのまま差し替え
#688465b5fdca
// NGパターン:null を挟まない dgv.DataSource = dt1; // (ユーザーが操作) dgv.DataSource = dt2; // 前の選択行・ソート状態を引きずる未収録
パターン2: DataSource = nullを挟まずに直接置き換え
#78d4c57559d1
// NGパターン:DataSource バインド中に Columns.Clear() dgv.DataSource = dt1; dgv.Columns.Clear(); // System.InvalidOperationException未収録
パターン3: Columns.Clear()を呼ぶタイミングを間違えている
#ae04c8396101
// Form_Load などの初期化時に1回だけ dgv.AutoGenerateColumns = false; // デザイナで作っておいた列の DataPropertyName を DataTable のカラム名と合わせる未収録
パターン1: AutoGenerateColumnsを切って手動で列定義する(推奨)
#ec3ad2300ef3
// フィールドとして1個持っておく private readonly BindingSource _bs = new BindingSource(); // 初期化時未収録
パターン2: BindingSourceを間に挟む
#0efb9f7de32a
private void RebindGrid(DataTable newDt) { dgv.SelectionChanged -= Dgv_SelectionChanged; try未収録
イベントハンドラが二重で飛んでくる
#4c679a21738a
