2008年3月18日火曜日

[.NET]イベント実装の2つの方法

コントロールの場合、独自イベントを発行する方法は2種類あります。
どちらの方法で実装しても結果は同じです。
「EventHandlerを独自で定義する方法」は、コントロールでなくても実装できるため汎用性が高く、実装も若干少なめです。しかし「EventHandlerをプロパティに保存する方法」はコントロールのそもそも持っているプロパティを使用するので何となくですが、自然な気がします。

・・・まぁどっちでもいいんですけどね。。。

以下サンプル。

■EventHandlerを独自で定義する方法
/// <summary>
/// EventHandlerを独自で定義する方法
/// </summary>
public partial class TextBoxEx2 : TextBox
{
    //イベントハンドラの定義
    public event EventHandler OnReturn;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public TextBoxEx2()
    {
        InitializeComponent();
    }

    /// <summary>
    /// キー押下
    /// </summary>
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        // リターンキー押下だったらイベント発行する
        if (e.KeyChar == '\r')
        {
            e.Handled = true;
            DoReturn();
            return;
        }
        base.OnKeyPress(e);
    }

    /// <summary>
    /// リターンキーイベント
    /// </summary>
    protected virtual void DoReturn(){
        if (OnReturn != null)
        {
            //イベントを発生させます
            OnReturn(thisEventArgs.Empty);
        }
    }
}


■EventHandlerをプロパティに保存する方法
/// <summary>
/// EventHandlerをプロパティに保存する方法
/// </summary>
public partial class TextBoxEx1 : TextBox
{
    /// <summary>
    /// イベント識別用キー変数
    /// </summary>
    private static readonly object EventOnReturn = new object();
    /// <summary>
    /// イベントハンドラー設定プロパティ
    /// </summary>
    public event EventHandler OnReturn
    {
        add { base.Events.AddHandler(EventOnReturnvalue); }
        remove { base.Events.RemoveHandler(EventOnReturnvalue); }
    }

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public TextBoxEx1()
    {
        InitializeComponent();
    }

    /// <summary>
    /// キー押下
    /// </summary>
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        // リターンキー押下だったらイベント発行する
        if (e.KeyChar == '\r')
        {
            e.Handled = true;
            DoReturn();
            return;
        }
        base.OnKeyPress(e);
    }

    /// <summary>
    /// イベント発火処理
    /// </summary>
    protected virtual void DoReturn()
    {
        //該当のイベントハンドラを取得
        EventHandler handler = (EventHandler)base.Events[EventOnReturn];
        //イベント発火
        if (handler != null)
        {
            handler(thisEventArgs.Empty);
        }
    }
}

0 件のコメント: