[備忘録] C# DataGridView


# &#91;備忘録&#93; DataGridView <!-- omit in toc -->

## Agenda <!-- omit in toc -->

- [1. Info](#1-info)
- [2. packages](#2-packages)
- [3. Rec](#3-rec)
  - [3.1. 表示関連](#31-表示関連)
  - [3.2. DataGridViewをDataTableに変換](#32-datagridviewをdatatableに変換)
  - [3.3. ボタン追加](#33-ボタン追加)
  - [3.4. 編集関連](#34-編集関連)

## 1. Info

- オブジェクトのnameは、初期配置したときの名称 dataGridView1 とします

## 2. packages

- ■ NuGetで導入したライブラリ

  ```txt
  特になし
  ```

## 3. Rec

### 3.1. 表示関連

- 表示関連

  - 複数行選択不可

    ```cs
    dataGridView1.MultiSelect = false;
    ```

  - 初めの列 読み取り専用

    ```cs
    dataGridView1.Columns[0].ReadOnly = true;
    ```

  - 初めの行 読み取り専用

    ```cs
    dataGridView1.Rows[0].ReadOnly = true;
    ```

  - スタイル変更

    ```cs
    dataGridView1.EnableHeadersVisualStyles = false;
    dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.LightCyan;
    dataGridView1.Columns[0].DefaultCellStyle.BackColor = Color.LightGoldenrodYellow;	
    ```

  - フォント＆文字サイズ変更

    ```cs
    dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("メイリオ", 14);
    dataGridView1.DefaultCellStyle.Font = new Font("メイリオ", 14);
    ```
    
  - ソート無効化

    ```cs
    foreach (DataGridViewColumn column in this.dataGridView1.Columns)
    {
      column.SortMode = DataGridViewColumnSortMode.NotSortable;
    }
    ```

  - すべての列の幅を自動調整する

    ```cs
    dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
    ```
    
  - はじめの列の幅を自動調整する

    ```cs
    dataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells);
    ```

  - 列の幅指定（添え字1 :: 2列目を300pxにする場合）

    ```cs
    dataGridView1.Columns[1].Width = 300;
    ```
    
  - すべての行の高さを自動調整

    ```cs
    if (dataGridView1.Rows.Count > 0)
    {
      dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);
    }
    ```

  - はじめの行の高さを自動調整

    ```cs
    if (dataGridView1.Rows.Count > 0)
    {
      dataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);
    }
    ```
    
  - 行テンプレートの高さを設定

    ```cs
    dataGridView1.RowTemplate.Height = 50;
    ```

  - 行の最低の高さを設定

    ```cs
    dataGridView1.RowTemplate.MinimumHeight = 50;
    ```
    
  - 1列目をidなどキーとして扱いたい場合の読み取り専用で色変更

    ```cs
    dataGridView1.Columns[0].ReadOnly = true;
    dataGridView1.Columns[0].DefaultCellStyle.BackColor = Color.LightYellow;
    ```

  - 3カラム目のセル内改行を反映

    ```cs
    dataGridView1.Columns[4].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
    ```
    
  - 奇数行の背景色変更

    ```cs
    dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.WhiteSmoke;
    ```

  - 新しい行を追加、削除できないようにする

    ```cs
    dataGridView1.AllowUserToAddRows = false;
    dataGridView1.AllowUserToDeleteRows = false;
    ```

  - カラム初期化

    ```cs
    dataGridView1.Columns.Clear();
    ```

  - ヘッダーの背景色、境界線変更

    ```cs
    // Visualスタイルを使用しない
    dataGridView1.EnableHeadersVisualStyles = false;

    // 列ヘッダの背景色を変更
    dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Yellow;
    // 行ヘッダの背景色を変更
    dataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.Green;

    // 列ヘッダと行ヘッダの境界線を変更
    dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
    dataGridView1.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
    ```

  - 列名変更

    ```cs
    var col = dataGridView1.Columns["ID"];
    col.HeaderText = "コード";
    ```

### 3.2. DataGridViewをDataTableに変換

- DataGridViewをDataTableに変換

  - dataGridView1 を変更すると dataGridView2 も変わってしまう

    ```cs
    var data = (DataTable)dataGridView1.DataSource;
    dataGridView2.DataSource = data;
    ```

  - 変えたくない場合は dataGridView1 のコピーを作成する

    ```cs
    var data = (DataTable)dataGridView1.DataSource;
    var newDt = data.Copy();
    ```

### 3.3. ボタン追加

- ボタン追加

  - 列にボタン追加

    ```cs
    //DataGridViewButtonColumnの作成
    DataGridViewButtonColumn column = new DataGridViewButtonColumn();
    //列の名前を設定
    column.Name = "詳細";
    //全てのボタンに"詳細閲覧"と表示する
    column.UseColumnTextForButtonValue = true;
    column.Text = "詳細閲覧";
    //DataGridViewに追加する
    dataGridView1.Columns.Add(column);
    ```

### 3.4. 編集関連

- 編集関連

  - 編集ロック

    ```cs
    //dataGridView1のセルを読み取り専用にする
    dataGridView1.ReadOnly = true;

    //dataGridView1の2番目の列を読み取り専用にする
    dataGridView1.Columns[1].ReadOnly = true;

    //dataGridView1の3番目の行を読み取り専用にする
    dataGridView1.Rows[2].ReadOnly = true;

    //dataGridView1の(0, 0)のセルを読み取り専用にする
    dataGridView1[0, 0].ReadOnly = true;

    //ユーザーがセルを編集できないようにする
    dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
    ```

  - 行選択、選択解除、ソート無効化

    ```cs
    //(0, 0)のセルを選択する
    dataGridView1[0, 0].Selected = true;

    //インデックス1の行を選択する
    dataGridView1.Rows[1].Selected = true;

    //インデックス2の列を選択する
    dataGridView1.Columns[2].Selected = true;
    ```

  - 選択された行の一番左の列の値（添え字 0）取得

    ```cs
    int idInt = (int)dataGridView1.CurrentRow.Cells[0].Value;
    ```

  - 行選択（3行目）

    ```cs
    dataGridView1.Rows[2].Selected = true;
    ```

  - 選択解除

    ```cs
    dataGridView1.ClearSelection();
    ```

  - ソート無効化

    ```cs
    foreach (DataGridViewColumn column in this.dataGridView1.Columns)
    {
      column.SortMode = DataGridViewColumnSortMode.NotSortable;
    }
    ```

  - 複数行選択させない

    ```cs
    dataGridView1.MultiSelect = false;
    ```

  - セルを選択すると行全体が選択される

    ```cs
    dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    ```