セルの描画時にイベントを発生させる方法

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

DataGridTextBoxColumn の派生クラスを生成し、以下の内容を記述する。
イベントの戻り値で、文字色/背景色が設定されている場合は、置換えて描画します。
/// <summary>CellFormatEven イベントを処理するメソッドを定義します。</summary>
public event CellFormatEventHandler CellFormat;

/// <summary>
/// 特定のセルの内容を描画します。 
/// 外部イベントルーチンからの戻り値で、文字色/背景色を変更します。
/// </summary>
protected override void Paint( Graphics g, Rectangle bounds, CurrencyManager source , int rowNum
                                , Brush backBrush, Brush foreBrush, bool alignToRight) 
{
    //Debug.WriteLine("Paint Start");

    //指定したrowNumのRowオブジェクトを取得
    object value = source.List[rowNum];

    //Formatイベント定義があれば、発生させ、イベントルーチンの戻り値を設定する
    if(CellFormat != null && value != null)
    {
        //セルの値を取得します。
        object cellValue = this.GetColumnValueAtRow( source, rowNum );
        
        //イベントデータを設定します。
        DataGridCellFormatEventArgs e
                     = new DataGridCellFormatEventArgs( value, rowNum, this.MappingName, cellValue );

        //イベント発生
        CellFormat(this, e);

        // 文字色/背景色が設定されている場合は、置換えます。
        if(e.BackBrush != null)
            backBrush = e.BackBrush;
        if(e.ForeBrush != null)
            foreBrush = e.ForeBrush;

        // テキストを描画します。
        base.PaintText(g, bounds, text, backBrush, foreBrush, alignToRight);

        //指定されたリソースを開放
        e.Dispose();
    }
    else
    {
        // テキストを描画します。
        base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight);
    }
}

セル描画時のイベントデータを定義します。
イベントメソッド内で判断に必要となる、カレントレコードオブジェクト、カレントレコード番号、列名、セルの値を渡します。
イベントデータの戻り値として必要に応じて、BackBrush, ForeBrush, BackBrushDisposable, ForeBrushDisposable を返します。
/// <summary>
///  CellFormatEvent イベントを処理するメソッドを表します。
/// </summary>
/// <param name="sender">イベントのソース。</param>
/// <param name="e">DataGridのセル表示情報。</param>
public delegate void CellFormatEventHandler(object sender, DataGridCellFormatEventArgs e);

/// <summary>
/// DataGridEventArgs の概要の説明です。
///  DataGridのセル表示情報
/// </summary>
public class DataGridCellFormatEventArgs : EventArgs, IDisposable
{
    private object              m_Row                   = null;
    private int                 m_RowIndex;
    private string              m_ColumnName            = null;
    private Brush               m_BackBrush             = null;
    private Brush               m_ForeBrush             = null;
    private bool                m_BackBrushDisposable   = false;
    private bool                m_ForeBrushDisposable   = false;
    private object              m_CellValue             = null;

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

    #region IDisposable メンバ

    /// <summary>
    ///  指定されたリソースを解放します。
    /// </summary>
    public void Dispose()
    {
        if( m_BackBrushDisposable )
        {
            m_BackBrush.Dispose();
        }
        if( m_ForeBrushDisposable )
        {
            m_ForeBrush.Dispose();
        }
    }

    #endregion

    /// <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 Brush ForeBrush
    {
        get{ return m_ForeBrush;}
        set{ m_ForeBrush = value;}
    }
    /// <summary>
    ///  カレントセルの背景色を取得または設定します。
    /// </summary>
    public Brush BackBrush
    {
        get{ return m_BackBrush;}
        set{ m_BackBrush = value;}
    }
    /// <summary>
    ///  カレントセルの表示文字色オブジェクトの開放が可能かを示す値を取得または設定します。(true:可能、false:不可能)
    /// </summary>
    public bool ForeBrushDisposable
    {
        get{ return m_ForeBrushDisposable;}
        set{ m_ForeBrushDisposable = value;}
    }    
    /// <summary>
    ///  カレントセルの背景色オブジェクトの開放が可能かを示す値を取得または設定します。(true:可能、false:不可能)
    /// </summary>
    public bool BackBrushDisposable
    {
        get{ return m_BackBrushDisposable;}
        set{ m_BackBrushDisposable = value;}
    }
}
【注意】
戻る