我想完成Winforms验证模式,例如检查文本框中的空字符串。因此,如果我有名为txtBox1
的文本框和事件处理程序txtBox1_Validated
。我想知道是否可以使用object sender
作为当前文本框属性的标识符?
例如,我有一个工作解决方案,我将当前文本框的Text
属性作为ValidateTextBox
方法的参数发送,如下所示
private void txtBox1_Validated(object sender, EventArgs e)
{
bool isEmpty = ValidateTextBox(txtBox1.Text);
...
}
我想知道是否可以在上面的方法中使用对象发送方来替换txtBox1.Text
参数?
由于
答案 0 :(得分:10)
假设您已将txtBox1_Validated
附加到相应的控件,绝对是:
TextBox textBox = (TextBox) sender;
bool isEmpty = ValidateTextBox(textBox.Text);
这意味着您可以为多个控件共享相同的方法。
编辑:由于其他两个答案(在撰写本文时)使用了as
而不是演员,让我解释为什么我非常刻意使用演员。
您将自己连接事件处理程序。您知道 sender
必须是TextBox
- 如果不是,则表示您的代码中存在错误。有了演员阵容,你会发现这个bug。使用as
,静默将被忽略 - 您很可能永远无法修复该错误。
答案 1 :(得分:4)
当然你可以:
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);
}
答案 2 :(得分:1)
您可以将sender
参数强制转换为正确对象的实例。
E.g。
private void txtBox1_Validated(object sender, EventArgs e)
{
var myTextbox = sender as TextBox;
if (myTextbox != null)
{
bool isEmpty = ValidateTextBox(myTextbox.Text);
}
}
答案 3 :(得分:1)
是的,可以编写类似
的内容private void txtBox1_Validated(object sender, EventArgs e)
{
bool isEmpty = ValidateTextBox(((TexBox)sender).Text);
}
但为什么不使用Validator控件?
答案 4 :(得分:0)
Sender变量是触发事件的对象。您需要强制转换对象以访问其属性:
TextBox myObj = sender as TextBox;
if(myObj != null)
{
// TODO
}
答案 5 :(得分:0)
private void button_Click(object sender, EventArgs e)
{
if ((sender == (object)button1))
}