概要
Windows Forms の UltraGrid でチェックボックス列を配置した場合、チェック状態の変更を検知し、その更新値を正しく取得する方法について説明します。
対象コントロール
- Infragistics Windows Forms — UltraGrid
問題
UltraGrid の列にチェックボックスを配置した際、チェック操作後に更新された値を取得したいが、どのイベントを使用すべきか、またイベント内でどのように値を参照すべきかが分かりにくい場合があります。
解説
CellChange イベントを使用する
CellChange イベントは、チェックボックスなどのエディタ上の値が変更された時点で発生します。チェックボックスの変更を検知するには、このイベントを使用してください。
⚠️ 注意: CellChange イベント発火時点では、値はまだセルに確定(commit)されていません。そのため、e.Cell.Value を参照すると旧値が返されます。
更新値の取得方法
方法 1: ExitEditMode で値を確定してから取得する
編集モードを終了して値をセルに確定させた後、e.Cell.Value から取得します。
private void ultraGrid1_CellChange(object sender, CellEventArgs e)
{
// 編集モードを終了して値を確定
ultraGrid1.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.ExitEditMode);
// 確定後の値を取得
bool isChecked = Convert.ToBoolean(e.Cell.Value);
}
方法 2: EditorResolved.Value から直接取得する
セルのエディタ(チェックボックス)の実体から、編集中の値をそのまま取得します。こちらは編集モードを終了せずに値を取得できます。
private void ultraGrid1_CellChange(object sender, CellEventArgs e)
{
// エディタの実体から現在の値を直接取得
bool isChecked = Convert.ToBoolean(e.Cell.EditorResolved.Value);
}
まとめ
| 取得方法 | コード | 特徴 |
|---|---|---|
| ExitEditMode 後に Cell.Value | e.Cell.Value | 値がセルに確定される。編集モードが終了する。 |
| EditorResolved.Value | e.Cell.EditorResolved.Value | 編集モードを維持したまま値を取得可能。 |
補足: AfterEnterEditMode イベントについて
AfterEnterEditMode イベントは名前から値の変更検知に使えそうに見えますが、これはセルが編集モードに入った直後に発火するイベントです。チェックボックスの値はこの時点ではまだ変更されていないため、このイベントでチェックボックスの更新値を取得することはできません。