.NET TIPS

DataGridコントロールを行選択モードにするには?

デジタルアドバンテージ
2004/02/27

 DataGridコントロールでは、デフォルトの機能として、グリッド上でセルを選択したり、行を選択したりできる。

デフォルトのDataGridコントロール
DataGridコントロールでは、セルを選択したり、行を選択したりできる。この画面では、セルを選択している。

 しかし、例えばDataGridコントロールを読み取り専用にして参照のみを可能にした場合、セル単位での選択を禁止し、行選択しかできないようにする方が(以降、これを行選択モードと呼ぶ)使い勝手はよいだろう。DataGridコントロールでは、このような行選択モードを擬似的に実現することができる。

行選択モードのDataGridコントロール
DataGridコントロールで、行の選択しかできない、つまりセル選択できないようになっている。

 DataGridコントロールで行選択モードを実現するには、セルがクリックされたとき、またはDataGridコントロールの内容がスクロールされたときに、「選択されているセル(以降、現在セル)の行を選択」すればよい。このクリックやスクロールのタイミングでは現在セルが再描画されるので、その再描画されるタイミングで行選択の処理が行える。具体的にはDataGridコントロールのPaintイベントのイベント・ハンドラとなるメソッドを追加して、そのメソッドでDataGridコントロールのSelectメソッドを呼び出す。これにより、現在セルの行を選択できる。

 ところで、Paintイベントのイベント・ハンドラ内でSelectメソッドを呼んだ場合、Selectメソッドにより行が選択され、DataGridコントロールを再描画する必要が発生し、再びPaintイベントが発生する。これではPaintイベント・ハンドラがPaintイベントを発生することになってしまい、無限ループになってしまうのではと感じるかもしれないが、実際にはそうならない。

 2回目に呼ばれたPaintイベント・ハンドラでSelectメソッドを呼んでも、行はすでに選択済みなので再描画の必要がなく、それ以上Paintイベントが発生することはない。よって、Paintイベント・ハンドラが2回呼び出されることになるものの、無限ループにはならないのである。

 では、この行選択モードをDataGridコントロールで実現するサンプル・プログラムを次に示す。

private void Form1_Load(object sender, System.EventArgs e)
{
  // Paintイベントのハンドラを追加する
  dataGrid1.Paint += new System.Windows.Forms.PaintEventHandler(this.dataGrid1_Paint);

  // DataGridコントロールを読み取り専用にする
  dataGrid1.ReadOnly = true;

  // テーブルの列を作成
  DataSet dataSet1 = new DataSet("商品マスター");
  DataTable dataTable1  = dataSet1.Tables.Add("商品テーブル");
  DataColumn dataClumn1 = dataTable1.Columns.Add("ID", typeof(int));
  DataColumn dataClumn2 = dataTable1.Columns.Add("商品");
  DataColumn dataClumn3 = dataTable1.Columns.Add("個数", typeof(int));

  // テーブルのスタイルを作成
  DataGridTableStyle dgTableStyle = new DataGridTableStyle();
  dgTableStyle.MappingName = dataTable1.TableName;
  dataGrid1.TableStyles.Add(dgTableStyle);

  // テーブルの列のスタイルを作成
  DataGridTextBoxColumn dgColumnStyle1 =
      new DataGridTextBoxColumn();
  DataGridTextBoxColumn dgColumnStyle2 =
    new DataGridTextBoxColumn();
  DataGridTextBoxColumn dgColumnStyle3 =
      new DataGridTextBoxColumn();
  dgColumnStyle1.MappingName = dataClumn1.ColumnName;
  dgColumnStyle2.MappingName = dataClumn2.ColumnName;
  dgColumnStyle3.MappingName = dataClumn3.ColumnName;
  // ヘッダーにタイトルを設定
  dgColumnStyle1.HeaderText = dataClumn1.ColumnName;
  dgColumnStyle2.HeaderText = dataClumn2.ColumnName;
  dgColumnStyle3.HeaderText = dataClumn3.ColumnName;
  // 列のスタイルをテーブル・スタイルに登録
  dgTableStyle.GridColumnStyles.Add(dgColumnStyle1);
  dgTableStyle.GridColumnStyles.Add(dgColumnStyle2);
  dgTableStyle.GridColumnStyles.Add(dgColumnStyle3);

  // テーブルにデータを追加
  dataTable1.Rows.Add(new Object[] {1, "みかん", 100});
  dataTable1.Rows.Add(new Object[] {2, "りんご", 300});
  dataTable1.Rows.Add(new Object[] {3, "バナナ", 120});
  dataTable1.Rows.Add(new Object[] {4, "すいか", 280});
  dataTable1.Rows.Add(new Object[] {5, "いちご", 200});
  dataTable1.Rows.Add(new Object[] {6, "メロン", 150});

  dataGrid1.SetDataBinding(dataSet1, dataTable1.TableName);
}

private void dataGrid1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  // 描画される場合には行を選択しなおす
  dataGrid1.Select(dataGrid1.CurrentCell.RowNumber);
}
DataGridコントロールで行選択モードを実現するサンプル・プログラム
サンプル・プログラム(C#:dgselline.cs、VB.NET:dgselline.vb)のダウンロード

 なおこのサンプル・プログラムは、読み取り専用でデータ参照を行う仕様になっている。DataGridコントロール全体を読み取り専用にするには、このサンプル・プログラムの例のように、DataGridコントロールのReadOnlyプロパティをtrueにするだけでよい。行の操作を自由に設定したい場合、例えば新規行の追加や既存行の変更は無効にしたいが、行削除の機能は有効にしておきたいような場合には、「TIPS:DataGridコントロールで行の追加/削除およびデータ編集を禁止するには?」を参考にするとよい。End of Article

カテゴリ:Windowsフォーム 処理対象:DataGridコントロール
使用ライブラリ:DataGridコントロール
関連TIPS:DataGridコントロールで行の追加/削除およびデータ編集を禁止するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールのヘッダーを複数行にするには?
[ASP.NET]DataGridコントロールですべての行にアクセスするには?
[ASP.NET]DataGridコントロールに選択ボタンを追加するには?
DataGridコントロールで行の追加/削除およびデータ編集を禁止するには?
[ASP.NET]DataGridコントロールの編集用テキストボックスを大きくするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間