按名称比较文本框控件属性

时间:2018-07-31 16:47:30

标签: c# wpf winforms

我有一个绑定在多个KeyPress上的TextBox事件,我想检查哪个TextBox被点击了,并根据点击的内容来做不同的事情。

我正在尝试根据文本框的TextBox属性比较点击哪个.Name。我正在switch语句中执行此操作,但是得到a Constant value is expected

private void UpdateValues(object sender, KeyPressEventArgs e)
{
    TextBox textBox = (TextBox)sender;

    switch (textBox.Name)
    {
        case txtBox1.Name: // Error here
            break;
    }
}

有没有办法解决这个问题?我不想将.Name硬编码为string,以防将来的开发人员从事此工作。

我可以这样做,还是会成为运行时错误?

private const string _TXTBOX1NAME = txtBox1.Name;


private void UpdateValues(object sender, KeyPressEventArgs e)
{
    TextBox textBox = (TextBox)sender;

    switch (textBox.Name)
    {
        case _TXTBOX1NAME: // Use the const variable
            break;
    }
}

编辑:

实际上,您不能像这样分配const值。

在不TextBox语句中将KeyPress硬编码为字符串的情况下,如何比较哪个.Name有一个case

2 个答案:

答案 0 :(得分:2)

您不能像这样使用switchcase必须是编译时常量。

您可以这样做:

private void UpdateValues(object sender, KeyPressEventArgs e)
{
    TextBox textBox = (TextBox)sender;

    switch (textBox.Name)
    {
        case "NameTextBox": 
            break;
        case "PasswordTextBox":
            break;
    }
}

如果您知道名称,则可以。您的示例失败了,因为textbox1.Name不是常数,而是从一个TextBox的实例读取的属性。

另一种方法是使用作为发件人指定的文本框引用:

private void UpdateValues(object sender, KeyPressEventArgs e)
{
    TextBox textBox = (TextBox)sender;

    if(textBox == textBox1) { ... }
    if(textBox == textBox2) { ... }
}

但是恕我直言,最好的解决方案是使用两个变更回调,每种方法一个。然后,您无需比较textboxtextbox的名称。

因此您可以将UpdateValues更改为一个UpdateUserNameUpdatedPasswort。这样做,方法名称将清楚地显示出该方法的作用(或至少应该做),从而使您的代码更具可读性。

答案 1 :(得分:1)

尝试

private void UpdateValues(object sender, KeyPressEventArgs e)
{
    TextBox textBox = (TextBox)sender;

    if (textBox.Name == textBox1.Name){
          //error
    } else if(textBox.Name == textBox2.Name){
          // and so on
    }
}