【C#】【Form】DataGridView ~ あれこれ編 ~

■ DataGridViewに関するあれこれ

【1】 Checkboxを追加
【2】 Checkboxにチェックされたかどうか調べる
【3】 DataGridViewの表示内容を変更する
【4】 DataGridViewの値をマウスなど選択した場合、その行を取得したい
【5】 BindingSource を通して DataGridView にDBのデータを表示する
【6】 DataGridView の横スクロールが表示されない

その他のDataGridViewに関する関連記事

 * 以下の関連記事を参照のこと
DataGridView ~ プロパティ編 ~
https://blogs.yahoo.co.jp/dk521123/14718079.html
DataGridView ~イベント編 ~
https://blogs.yahoo.co.jp/dk521123/23687833.html
DataGridView ~ ソート編 ~
https://blogs.yahoo.co.jp/dk521123/37914797.html
DataGridView ~ 画像・アイコン編 ~
https://blogs.yahoo.co.jp/dk521123/22293894.html
DataGridView を Label のように扱う
https://blogs.yahoo.co.jp/dk521123/29362064.html
DataGridView に ACCESS のデータを表示させる
https://blogs.yahoo.co.jp/dk521123/32859068.html
DataGridView に右クリックを適用する
https://blogs.yahoo.co.jp/dk521123/30488275.html

【1】 Checkboxを追加

private void Form1_Load(object sender, EventArgs e)
{
  DataGridViewCheckBoxColumn column1 = new DataGridViewCheckBoxColumn();
  dataGridView1.Columns.Add(column1);
}

【2】 Checkboxにチェックされたかどうか調べる

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0 &&
      dataGridView1[e.ColumnIndex, e.RowIndex].Value.Equals(true))
    {
         MessageBox.Show(string.Format("{0}行目のチェックボックスにチェック付きました"
          , e.RowIndex));
    }
    else if (e.ColumnIndex == 0 &&
      dataGridView1[e.ColumnIndex, e.RowIndex].Value.Equals(false))
    {
         MessageBox.Show(string.Format("{0}行目のチェックボックスにチェック外されました"
          , e.RowIndex));
    }
}

参考資料

http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html
http://d.hatena.ne.jp/Seasons/20061002/1159719326

【3】 DataGridViewの表示内容を変更する

 例えば、コードを表示用に変換したい場合などに使用する

サンプル

// DataGridViewの表示を変更
// DataGridViewの「性別コード」の表示を変更する
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataRowView dataRowView
        = (DataRowView)this.dataGrid1.Rows[e.RowIndex].DataBoundItem;

    TESTTABLERow row = (TESTTABLERow)dataRowView.Row;

    // カラム名
    string columnsName = this.dataGridViewPersonalDataList.Columns[e.ColumnIndex].Name;

    // 性別(SexCode = 1なら「男」、それ以外は、「女」)
    if ((TESTTABLETable.SEXCODEColumn.ColumnName).Equals(columnsName))
    {
        if (row.SEXCODE == "1")
        {
             e.Value = "男"
        }
        else
        {
             e.Value = "女"
        }
    }
}

【4】 DataGridViewの値をマウスなど選択した場合、その行を取得したい

 例えば、マウスで選択した値をTextBoxなどの別のコントロールに反映するなどに使用できる

サンプル

// CellEnter処理回避フラグ
private bool flg = false;

// TESTテーブル
private TESTDataTable testTable = null;
// データグリッドにおいて、ユーザが選択した行のインデックス
private int selectedIndex = -1;

・・・略(TESTテーブルに値が入っている必要がある)・・・

// 検索結果データグリッドビュー_CellEnter
// 検索結果データグリッドビューの表示を変更
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    if (!this.flg
        && e.RowIndex >= 0 // 選択されたインデックスが0以下
        && (this.testTable != null && this.testTable.Count >= e.RowIndex) // 選択されたインデックスがテーブルのデータ数以上
        && e.RowIndex != this.selectedIndex // 選択されたインデックスが以前のものと異なる
        )
    {
        // 選択されたインデックスを取得
        this.selectedIndex = e.RowIndex;

        // 選択された情報のデータローを取得(dataRowView.Rowで取得できる)
        DataRowView dataRowView
            = (DataRowView)this.dataGridView.Rows[this.selectedIndex].DataBoundItem;


【5】 BindingSource を通して DataGridView にDBのデータを表示する

準備

 * bindSource : 1
 * dataGridView : 1
 * DataBase : 1 (仮に「customerDB.mdb」にある「customer」テーブル)

サンプル

System.Data.OleDb.OleDbConnection connection
    = new System.Data.OleDb.OleDbConnection();
System.Data.OleDb.OleDbDataAdapter dataAdapter;
DataSet dataSet = new DataSet("customer");

// 接続文字列の作成
string path = "C:\\customerDB.mdb";
connection.ConnectionString = string.Format(
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source={0};" +
"Persist Security Info=False", path);

// SQL文作成
dataAdapter = new System.Data.OleDb.OleDbDataAdapter(
    "SELECT * FROM customer", connection);

// データセットにデータを設定する
dataAdapter.Fill(dataSet, "customer");

// データソースを連結する
this.bindingSource.DataSource = dataSet;
this.bindingSource.DataMember = "customer";

// DataGridViewにBindingSourceを連結
this.dataGridView.DataSource = this.bindingSource;

参考資料

http://hiros-dot.net/CS2005/Control/BindingSource/BindingSource02.htm

【6】 DataGridView の横スクロールが表示されない

【確認点1】DataGridView の列(DataGridViewColumnオブジェクト)のプロパティ Frozen が true になっている

 * 1項目でも「Frozen:true」になっていると横スクロールが行われない
 * 「固定列のとき、列の AutoSize モードを Fill に設定することはできません。」という
    エラーが表示された場合、「Frozen:true」になっている可能性あり

参考資料

http://www.atmarkit.co.jp/fdotnet/dotnettips/509dgvfrozen/dgvfrozen.html

【確認点2】DataGridView の列(DataGridViewColumnオブジェクト)のプロパティ AutoSize が Fill になっていないか確認する

 * 「AutoSize :None」にして動作を確認

【確認点3】プロパティ ScrollBars を確認する

 * ScrollBars : スクロール バーの種類を指定

【確認点4】プロパティ AutoSizeColumnsMode が Fill になっていないか確認する

 * 「AutoSize :None」にして動作を確認
 * AutoSizeColumnsMode : 列の幅が自動的に調整されるようにする