3

テキストボックスの空の文字列をチェックするなど、Winforms 検証パターンを実現したいと考えています。したがって、名前付きのテキストボックスtxtBox1とイベントハンドラーがあるとしtxtBox1_Validatedます。object sender現在の textbox プロパティの識別子として使用できるのだろうか?

たとえばText、現在のテキストボックスのプロパティを引数としてValidateTextBoxこのようなメソッドに送信する実用的なソリューションがあります

private void txtBox1_Validated(object sender, EventArgs e)
{
    bool isEmpty = ValidateTextBox(txtBox1.Text);
    ...
}

上記のメソッドでオブジェクト送信者を使用してtxtBox1.Textパラメーターを置き換えることは可能ですか?

ありがとう

4

6 に答える 6

13

適切なコントロールに接続していると仮定するとtxtBox1_Validated、絶対に:

TextBox textBox = (TextBox) sender;
bool isEmpty = ValidateTextBox(textBox.Text);

もちろん、これは、複数のコントロールに対して同じメソッドを共有できることを意味します。

編集:他の2つの回答(執筆時点)がasキャストの代わりに使用されているため、キャストを意図的に使用した理由を説明しましょう。

イベント ハンドラーを自分で接続します。そうでない場合は、コードにバグがあることを示していますキャストを使用すると、そのバグについて知ることができます。を使用すると、黙って無視されます - そしておそらくバグを修正することはできません。senderTextBoxas

于 2013-07-29T19:39:48.137 に答える
5

もちろん、次のことができます。

private void txtBox1_Validated(object sender, EventArgs e)
{
    TextBox txt = sender as TextBox;
    if(txt != null)
    {
       bool isEmpty = ValidateTextBox(txt.Text);
    }
}

編集:

実はif(txt != null)If Okアンチパターン

これはより良いでしょう:

private void txtBox1_Validated(object sender, EventArgs e)
{
    TextBox txt = sender as TextBox;
    if(txt == null)
    {
        // Handler error
    }

    bool isEmpty = ValidateTextBox(txt.Text);
}
于 2013-07-29T19:39:57.170 に答える
1

はい、次のように書くことは可能です

private void txtBox1_Validated(object sender, EventArgs e)
{
    bool isEmpty = ValidateTextBox(((TexBox)sender).Text);
}

しかし、代わりに Validator コントロールを使用しないのはなぜでしょうか?

于 2013-07-29T19:41:03.550 に答える
1

senderパラメータを正しいオブジェクトのインスタンスにキャストできます。

例えば

private void txtBox1_Validated(object sender, EventArgs e)
{
    var myTextbox = sender as TextBox;
    if (myTextbox != null) 
    {
        bool isEmpty = ValidateTextBox(myTextbox.Text);
    }
}
于 2013-07-29T19:40:09.387 に答える
0
 private void button_Click(object sender, EventArgs e)
 {
       if ((sender == (object)button1))
 }
于 2013-11-18T07:15:09.520 に答える
0

Sender 変数は、イベントをトリガーしたオブジェクトです。プロパティにアクセスするには、オブジェクトをキャストする必要があります。

TextBox myObj = sender as TextBox;
if(myObj != null) 
{
 // TODO
}
于 2013-07-29T19:43:38.113 に答える