我有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;
}
答案 0 :(得分:3)
看看这里:
<击> TabIndex changed to Enter for all forms in C# 击>
How to send focus to control with tabindex lower than current control in C# windows form application?
您可以使用该解决方案和TabIndex以更清晰的方式完成此行为。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.tabindex(v=vs.110).aspx
答案 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的情况下,将参与控件放在列表中并使用相同的概念。
*从手机上回答,请原谅