【C#】DataGridViewの特殊な列タイプ ~チェックボックス列・コンボボックス列・ボタン列~

広告

DataGridViewの列は、実はテキスト表示専用のDataGridViewTextBoxColumnだけではありません。用途に応じたさまざまな列タイプが用意されており、使いこなすとフォームらしい操作性のある一覧画面が作れます。本記事では代表的な4つの列タイプを紹介します。

1. チェックボックス列(DataGridViewCheckBoxColumn)

複数行を選択して一括処理したい場合の定番が、先頭列にチェックボックスを置くパターンです。

var checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.Name = "IsSelected";
checkColumn.HeaderText = "選択";
checkColumn.Width = 50;
dataGridView1.Columns.Insert(0, checkColumn);

チェック状態を即座に反映させたい場合(クリック直後は編集モードのため値が確定していない)は、CurrentCellDirtyStateChangedイベントで明示的にコミットします。

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.CurrentCell is DataGridViewCheckBoxCell)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

チェックされた行だけを取得する処理は次のようになります。

var selectedRows = dataGridView1.Rows.Cast<DataGridViewRow>()
    .Where(r => Convert.ToBoolean(r.Cells["IsSelected"].Value) == true);

2. コンボボックス列(DataGridViewComboBoxColumn)

「都道府県」「ステータス」など、選択肢が決まっている値の入力にはコンボボックス列が便利です。

var statusColumn = new DataGridViewComboBoxColumn();
statusColumn.Name = "Status";
statusColumn.HeaderText = "ステータス";
statusColumn.Items.AddRange("未着手", "作業中", "完了");
dataGridView1.Columns.Add(statusColumn);

マスタテーブルの内容を選択肢にしたい場合は、Itemsに文字列を追加する代わりにDataSource/DisplayMember/ValueMemberを設定することで、DataTableと連携させることもできます。

3. ボタン列(DataGridViewButtonColumn)

行ごとに「詳細」「削除」などのアクションボタンを置きたい場合に使います。

var buttonColumn = new DataGridViewButtonColumn();
buttonColumn.Name = "Delete";
buttonColumn.HeaderText = "";
buttonColumn.Text = "削除";
buttonColumn.UseColumnTextForButtonValue = true; // 全行で同じ文字列を表示
dataGridView1.Columns.Add(buttonColumn);

クリック処理はCellContentClickで拾います(CellClickだとヘッダー部分もカウントされてしまうため、こちらを使うのが安全です)。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.Columns[e.ColumnIndex].Name == "Delete" && e.RowIndex >= 0)
    {
        dataGridView1.Rows.RemoveAt(e.RowIndex);
    }
}

4. 画像列(DataGridViewImageColumn)

商品一覧のサムネイル表示など、画像を並べたい場合に使います。

var imageColumn = new DataGridViewImageColumn();
imageColumn.Name = "Thumbnail";
imageColumn.HeaderText = "画像";
imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
dataGridView1.Columns.Add(imageColumn);

// 各行への値の設定(Imageオブジェクトを渡す)
dataGridView1.Rows[0].Cells["Thumbnail"].Value = Image.FromFile("sample.png");

画像を大量に読み込むと表示が重くなりやすいので、サムネイルサイズにリサイズしてから渡すのがおすすめです。

まとめ

列タイプ 主な用途
DataGridViewCheckBoxColumn 複数行選択・フラグ管理
DataGridViewComboBoxColumn 選択肢が決まっている値の入力
DataGridViewButtonColumn 行ごとのアクション(削除・詳細など)
DataGridViewImageColumn サムネイルなどの画像表示

テキスト列だけで作っていた一覧画面も、目的に合った列タイプに置き換えるだけで操作性がぐっと上がります。

次回は、DataGridViewの内容をExcel/CSVへエクスポートする方法を扱います。

訪問数 3 回, 今日の訪問数 3回

広告

WindowsFormアプリ

Posted by hidepon