.NET TIPS

DataGridコントロールで変更されたセルを検証するには?

デジタルアドバンテージ
2003/12/19

 WindowsフォームのDataGridコントロールでセルのデータ内容が変更されると、変更されたデータを検証して、範囲外の入力の場合にはエラーを表示したいときがある。そのようなときには、グリッドにデータ連結しているDataTableクラス(System.Data名前空間)のオブジェクトのColumnChangingイベントをハンドルして、データの検証処理を行うとよい。ColumnChangingイベントはセルの変更しようとしているタイミングで通知されるイベントだ。

 まず、ColumnChangingイベントのハンドラを作成する。そのコードを以下に示す。

private void Form1_Load(object sender, System.EventArgs e)
{
  // テーブルの列を作成
  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));

  // テーブルにデータを追加
  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});

  // セルのデータが変更されたときのイベントハンドルする
  dataSet1.Tables[dataTable1.TableName].ColumnChanging +=
    new DataColumnChangeEventHandler(this.dataSet1_ColumnChanging);


  // データグリッドにテーブルを表示する
  dataGrid1.SetDataBinding(dataSet1, dataTable1.TableName);
}
セルの変更を通知するColumnChangingイベントのハンドラの追加

 次に、そのハンドラのパラメータとして渡されるDataColumnChangeEventArgsクラスのオブジェクトを使って、セルに入力されたデータを取得し、そのハンドラ内でデータ検証を行う。データが範囲外の入力値の場合は、ここで適切なエラー処理を行えばよい。今回の例では、データが範囲外の場合、DataGridコントロールの機能の1つである「列のエラーの説明(ColumnError)」を設定して、例外をスローする。具体的なコードを次に示す。

/// <summary>
/// DataGrid内のテーブルのセルが変更されたイベントをハンドルする
/// </summary>

private void dataSet1_ColumnChanging(object sender, System.Data.DataColumnChangeEventArgs e)
{
  // 「個数」の列では100個より大きい値を設定できないようにする
  if (e.Column.ColumnName.Equals("個数"))
  {
    int iOldValue = (int)e.Row[e.Column];
    int iNewValue = (int)e.ProposedValue;

    // 100個より大きい値が設定されているか
    if (iNewValue > 999)
    {
      e.Row.RowError = "個数の入力にエラーがあります。";
      e.Row.SetColumnError(e.Column,
        iNewValue.ToString() + "個が入力されましたが、" +
        "1000個以上の数値は入力できません。\n" +
        "自動的に元の数" + iOldValue.ToString() +
        "個に戻しました。\n" +
        "999個以下の数値を入力してください。");
      throw new Exception("個数" + iNewValue.ToString() +
        "は、999以下にしてください。");
    }
  }
}
ColumnChangingイベント・ハンドラでの入力データの検証(C#)

 上記のコードでは、「e.Row[e.Column]」で変更のあったセルの変更前データを取得して、「e.ProposedValue」で変更後のデータを取得している。なお、「e.Row」はデータ行を意味するDataRowクラス(System.Data名前空間)のオブジェクトで、「e.Column」はデータ列を意味するDataColumnクラス(System.Data名前空間)のオブジェクトである。

 データが範囲外の場合のエラー処理では、「e.Row.RowError」メソッドで「行ヘッダー(行全体)」に対して簡単なエラーの説明を設定し、「e.Row.SetColumnError」メソッドで「セル(行内の1つの列)」に対して詳細なエラーの説明を設定している。これらのメソッドはいずれもDataRowクラスのメソッドだ。また、その後の「throw new Exception(……)」のコードで例外をスローして、データが変更されるのを中止している。これにより、セルのデータは変更前のデータに自動的に戻る。

 上記のサンプル・プログラムを実行して、範囲外のデータを入力すると、次の画面のようになる。

セル変更時にデータ検証するプログラムの実行例
上記のサンプル・コードを実行してプログラムを起動し、範囲外のデータを入力してエラーを発生させた後の画面。
  行ヘッダーにエラー・マークが表示されている。DataRowクラスのRowErrorメソッドの呼び出しにより表示される。
  エラー・マークにカーソルを合わせると、設定したエラーの説明が表示される。
  セルにエラー・マークが表示されている。DataRowクラスのSetColumnErrorメソッドの呼び出しにより表示される。

 表示したエラー・マークを取り消すには、DataRowクラスのClearErrorsメソッドを呼び出す。End of Article

カテゴリ:Windowsフォーム 処理対象:DataGridコントロール
使用ライブラリ:DataGridコントロール
使用ライブラリ:DataTableクラス(System.Data名前空間)
使用ライブラリ:DataRowクラス(System.Data名前空間)
使用ライブラリ:DataColumnクラス(System.Data名前空間)
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールの同一列内のセルを結合するには?
[ASP.NET]DataGridコントロールですべての行にアクセスするには?
WPF:DataGridやListViewなどに表示しているデータを別スレッドから変更するには?
[ASP.NET]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 記事ランキング

本日 月間