1

TextBox を継承するカスタム コントロールを作成しました。

Validating イベントによって呼び出される ValidateTextBoxEntry メソッドがあります。

通常、ビジュアル エディターのプロパティ エディターを使用して、カスタム コントロールのすべてのインスタンスの Validating イベントに ValidateTextBoxEntry を追加します。

代わりに、カスタム コントロールのコンストラクターに、次のような行をすべてのイベント ハンドラーに自動的に追加します。

    public CustomTextBox()
    {
        InitializeComponent();
        this.Validating += 
        new System.ComponentModel.CancelEventHandler(ValidateTextBoxEntry);
   }

カスタム コントロールのすべてのインスタンスに Validating イベント ハンドラーを追加するエレガントな方法は何ですか?

4

3 に答える 3

1

これはおそらく正しいアプローチではないというコメントで elgonzo に同意しますが、interface.

ハンドラー定義を含むインターフェースを定義し、各フォームにそのインターフェースを実装させると、適切なフォームが見つかれば、コントロール内からハンドラーを接続できます。Parentそのために、プロパティが null になるまで反復処理を続けることができます。私は本当にそれが努力する価値があるとは思わない:

//the interface
public interface IShouldntDoThis
{
    void MyTextBox_Validating(object sender, CancelEventArgs e);
}

//the control
public class MyTextBox : TextBox
{
    public MyTextBox()
    {

    }

    protected override void InitLayout()
    {
        base.InitLayout();

        Control parent = this.Parent;
        while (parent.Parent != null)
        {
            parent = parent.Parent;
        }

        //parent should now be the Form
        IShouldntDoThis test = parent as IShouldntDoThis;
        if (test != null)
        {
            this.Validating += test.MyTextBox_Validating;
        }
    }
}

//the form
public partial class MainForm : Form, IShouldntDoThis
{
    public Form1()
    {
        InitializeComponent();
    }

    public void MyTextBox_Validating(object sender, CancelEventArgs e)
    {
        throw new NotImplementedException();
    }
}
于 2014-08-04T22:14:43.093 に答える
0

結局のところ、コンストラクターに行を追加することは (質問で示したように)、正しいアプローチです(elgonzo が述べたように - ありがとうございます)。

重要なのは、イベント ハンドラーをクラス自体のメソッドにすることです。

于 2014-08-05T21:10:30.297 に答える