3

我想完成 Winforms 验证模式,例如检查文本框中的空字符串。因此,如果我有名为的文本框txtBox1和事件处理程序txtBox1_Validated。我想知道是否可以object sender用作当前文本框属性的标识符?

例如,我有一个可行的解决方案,我将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);

当然,这意味着您可以为多个控件共享相同的方法。

编辑:由于其他两个答案(在撰写本文时)已使用as而不是演员表,让我解释一下为什么我非常故意使用演员表。

您将自己连接事件处理程序。您知道sender一定是TextBox- 如果不是,则表明您的代码中存在错误。通过演员表,您会发现该错误。使用as,它将被默默地忽略 - 你很可能永远不会修复这个错误。

于 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

您可以将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 回答
1

是的,可以写类似的东西

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

但是为什么不使用验证器控件呢?

于 2013-07-29T19:41:03.550 回答
0

Sender 变量是触发事件的对象。您需要强制转换对象以访问其属性:

TextBox myObj = sender as TextBox;
if(myObj != null) 
{
 // TODO
}
于 2013-07-29T19:43:38.113 回答
0
 private void button_Click(object sender, EventArgs e)
 {
       if ((sender == (object)button1))
 }
于 2013-11-18T07:15:09.520 回答