セルの編集開始時にイベントを発生させる方法

  DataGrid 上のセルの編集開始時にイベントを発生させるには、DataGridTextBoxColumn, DataGridBoolColumn の派生クラスを生成し、「Edit()」メソッドをオーバーライドし、処理内容を記述することで行います。
 セルの編集開始時のイベントを定義することで、セルまたは行単位で編集可否の切り替えが可能になります。
【使い方】

DataGridTextBoxColumn の派生クラスを生成し、以下の内容を記述する。
イベントの戻り値で、編集中止が設定されている場合は、処理を中断します。
/// <summary>ValueChangingEvent イベントを処理するメソッドを定義します。</summary>
public event ValueChangingEventHandler ValueChanging;

/// <summary>
/// 値を編集するためにセルを準備します。
///  (列のセルがアクティブになる時に呼ばれます。)
/// </summary>
protected override void Edit( CurrencyManager source, int rowNum, Rectangle bounds
                                , bool readOnly, string instantText, bool cellIsVisible    ) 
{
    //Debug.WriteLine("Edit Start");

    //編集開始前の値をセットします。
    object oldValue = GetColumnValueAtRow(source,rowNum);
    
    //CellValueChangingイベント定義があれば、発生させ、イベントルーチンの戻り値を設定する
    if(ValueChanging != null)
    {
        //指定したrowNumのRowオブジェクトを取得
        object value = source.List[rowNum];

        if( value != null )
        {
            DataGridValueChangingEventArgs e
                           = new DataGridValueChangingEventArgs( value, rowNum, this.MappingName, oldValue );
            //イベント発生
            ValueChanging(this, e);

            //編集中止の場合、Exit
            if ( e.Cancel )
                return;
        }
    }

    // 元のEditメソッドを実行する
    base.Edit( source, rowNum, bounds, readOnly, instantText, cellIsVisible );
}

セル編集時のイベントデータを定義します。
イベントメソッド内で判断に必要となる、カレントレコードオブジェクト、カレントレコード番号、列名、セルの値を渡します。
イベントデータの戻り値として Cancel を返します。
/// <summary>
///  ValueChangingEvent イベントを処理するメソッドを表します。
/// </summary>
/// <param name="sender">イベントのソース。</param>
/// <param name="e">DataGridのセル更新情報。</param>
public delegate void ValueChangingEventHandler(object sender, DataGridValueChangingEventArgs e);

/// <summary>
/// DataGridValueChangingEventArgs の概要の説明です。
/// </summary>
public class DataGridValueChangingEventArgs : EventArgs
{
    private object              m_Row;
    private int                 m_RowIndex;
    private string              m_ColumnName;
    private object              m_CellValue;
    private bool                m_Cancel = false;

    /// <summary>
    /// DataGridValueChangingEventArgs クラスの新しいインスタンスを初期化します。
    /// </summary>
    /// <param name="row">編集元となる行データオブジェクト</param>
    /// <param name="rowNum">編集元となる行の番号</param>
    /// <param name="col">編集元となる列名</param>
    /// <param name="cellValue">編集対象となる Object 値</param>
    public DataGridValueChangingEventArgs( object row, int rowNum, string col, object cellValue )
    {
        m_Row           = row;
        m_RowIndex      = rowNum;
        m_ColumnName    = col;
        m_CellValue     = cellValue;
    }

    /// <summary>
    ///  カレントセルを含む Row Object を取得します。
    /// </summary>
    public object Row
    {
        get{ return m_Row;}
    }
    /// <summary>
    ///  カレントセルの値を取得します。
    /// </summary>
    public object CurrentCellValue
    {
        get{ return m_CellValue;}
    }
    /// <summary>
    ///  カレントセルのレコード番号を取得します。
    /// </summary>
    public int RowIndex
    {
        get{ return m_RowIndex;}
    }
    /// <summary>
    ///  カレントセルを含む列に割り当てられたデータ メンバの名前を取得します。
    /// </summary>
    public string ColumnName
    {
        get{ return m_ColumnName;}
    }
    /// <summary>
    ///  編集操作の中止示す値を取得または設定します。
    /// </summary>
    public bool Cancel
    {
        get{ return m_Cancel;}
        set{ m_Cancel = value;}
    }
}
【応用】
 DataGridColumnStyle の派生クラスに ComboBox を組み込み、イベントを定義することで、編集開始時にレコード内の値に応じた選択項目の絞込みを行うことも可能になります。
戻る