对象sender作为验证当前文本框的参数

本文关键字:文本 参数 sender 验证 对象 | 更新日期: 2023-09-27 18:25:28

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

例如,我有一个有效的解决方案,我将当前文本框的Text属性作为参数发送给像这样的ValidateTextBox方法

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

我想知道是否可以使用上述方法中的对象发送器来替换txtBox1.Text参数?

感谢

对象sender作为验证当前文本框的参数

假设您已将txtBox1_Validated附加到适当的控件,则绝对:

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

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

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

您将自己连接事件处理程序。您知道sender必须是TextBox——如果不是,则表明代码中存在错误。有了演员阵容,你就会发现那个bug。使用as,它将被忽略,而且很可能永远不会修复这个错误。

当然可以:

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);
}

您可以将sender参数强制转换为正确对象的实例。

例如

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

是的,可以编写类似的东西

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

但为什么不使用Validator控件呢?

Sender变量是触发事件的对象。您需要投射对象以访问其属性:
TextBox myObj = sender as TextBox;
if(myObj != null) 
{
 // TODO
}
 private void button_Click(object sender, EventArgs e)
 {
       if ((sender == (object)button1))
 }