我们可以将以下if语句转换为单个开关吗?

时间:2014-02-03 18:29:51

标签: c# winforms

我有3个文本框(但在实际场景中有超过3个文本框),每个文本框都连接到下面的单个事件处理程序。

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    TextBox tb = sender as TextBox;
    if (e.KeyChar == (char)Keys.Enter)
    {
        if (tb.Equals(textBox1)) textBox2.Focus();
        if (tb.Equals(textBox2)) textBox3.Focus();
        if (tb.Equals(textBox3)) button1.Focus();
    }
}

当用户按下回车键时,焦点将移动到下一个文本框。我想避免在使用switch时使用硬编码字符串常量,因此我被迫使用上面给出的if

我的问题是:是否有可能使用switch但不使用硬编码字符串常量?

修改

我不想写下面的内容,因为我讨厌硬编码的常量值。

switch (tb.Name)
{
    case "textboxnameone":
        textBox2.Focus();
        break;
    case "textboxnametwo":
        textBox3.Focus();
        break;
    case "textboxnamethree":
        button1.Focus();
        break;
}

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

如果正确设置控件的 TabIndex 属性,则可以使用它。

TextBox tb = sender as TextBox;

var dict = this.Controls.Cast<Control>()
               .ToDictionary(c => c.TabIndex, c);

dict[tb.TabIndex + 1].Focus();

答案 2 :(得分:1)

假设您在表单的开头定义了这个词典

Dictionary<TextBox, Action>dicFocus = new Dictionary<TextBox,Action>();
dicFocus.Add(t1, () => t2.Focus());
dicFocus.Add(t2, () => t3.Focus());
dicFocus.Add(t3, () => t1.Focus());

其中t1,t2,t3等是具有公共按键事件的文本框,而Action是您在按键事件发生时要执行的方法。

现在您的KeyPress可以写为

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    TextBox tb = sender as TextBox;
    if(dicFocus.Keys.Contains(tb) 
        dicFocus[tb].Invoke();
}

如果在开发期间某人更改了控件的taborder,这种方法将始终关注您所需的控件。此外,整个事件都保存在您表单的特定位置,如果需要不同的订单,可以轻松调整

答案 3 :(得分:0)

为TabIndex提供顺序值,并在这种情况下,检查发件人的TabIndex,每次只关注下一个。如果你的数字过高,请回到第一个。

或者,在不使用TabIndex的情况下,将参与控件放在列表中并使用相同的概念。

*从手机上回答,请原谅