セルの編集開始を無効にしてボタンコントロールとして利用する方法

  DataGrid 上のセル選択時に編集開始を無効にしてボタンコントロールとして利用するには、DataGridTextBoxColumn, DataGridBoolColumn の派生クラスを生成し、「Edit()」メソッドをオーバーライドし、処理内容を記述することで行います。
 セルの編集開始時のイベントを定義することで、フラット表示のボタンコントロールとして利用できます。
【使い方】

DataGridTextBoxColumn の派生クラスを生成し、以下の内容を記述します。
ベースのEditメソッドを呼ばないことで、編集開始を無効にします。
また、イベントを定義することで、セル選択時にイベントを発生させることができます。
/// <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);
        }
    }
}

セル編集時のイベントデータを定義します。
イベントメソッド内で判断に必要となる、カレントレコードオブジェクト、カレントレコード番号、列名、セルの値を渡します。
/// <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;

    /// <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;}
    }
}
【応用】
 DataGridColumnStyle の派生クラスに ComboBox を組み込み、イベントを定義することで、編集開始時にレコード内の値に応じた選択項目の絞込みを行うことも可能になります。
戻る