1.获取控件焦点
[DllImport("user32.dll")]
public static extern IntPtr GetFocus();
private Control GetFocusedControl()
{
IntPtr handle = GetFocus();
Control focusedControl = Control.FromHandle(handle);
return focusedControl;
}
2.通过控件名找到具体控件
private Control getControlFromName(Control container, string controlName)
{
foreach (Control c in container.Controls)
{
if (c.Name == controlName)
{
return c;
}
if (c.HasChildren)
{
//这里不能直接写return getControlFromName(c, controlName);因为会导致只执行第一个子容器控件,如果未找到就提前返回了Null;
Control myControl = getControlFromName(c, controlName);
if (myControl != null)
{
return myControl;
}
}
}
//并非所有的代码路径都返回值,未找到就返回null
return null;
}
3.具体调用
private void F_AQL_BA_Entry_KeyDown(object sender, KeyEventArgs e)
{
string focusedControl = GetFocusedControl().Name;
// 键码获取
if ((Keys)e.KeyCode == Keys.Left)
{
Debug.WriteLine("左键");
int tbnum = int.Parse(focusedControl.Split('Q')[1]) - 1;
if (tbnum > 0)
{
string tbX = "tb" + tbnum;
TextBox control = getControlFromName(this, tbX) as TextBox;
control.Focus();
}
}
else if ((Keys)e.KeyCode == Keys.Right)
{
int tbnum = int.Parse(focusedControl.Split('Q')[1]) + 1;
if (tbnum < 10)
{
string tbX = "tbQ" + tbnum;
//TextBox c = this.Controls["tb2"] as TextBox;
TextBox control = getControlFromName(this, tbX) as TextBox;
control.Focus();
}
}
else if ((Keys)e.KeyCode == Keys.Up)
{
int tbnum = int.Parse(focusedControl.Split('Q')[1]) + 1;
Debug.WriteLine("上键");
if (tbnum > 9&&tbnum<= 12)
{
string tbX = "tbQ" + tbnum;
//TextBox c = this.Controls["tb2"] as TextBox;
TextBox control = getControlFromName(this, tbX) as TextBox;
control.Focus();
}
else
{
TextBox control = getControlFromName(this, "tbQ10") as TextBox;
control.Focus();
}
}
else if ((Keys)e.KeyCode == Keys.Down)
{
int tbnum = int.Parse(focusedControl.Split('Q')[1]) - 1;
Debug.WriteLine("下键");
if (tbnum > 9)
{
string tbX = "tbQ" + tbnum;
//TextBox c = this.Controls["tb2"] as TextBox;
TextBox control = getControlFromName(this, tbX) as TextBox;
control.Focus();
}
else
{
TextBox control = getControlFromName(this, "tbQ1") as TextBox;
control.Focus();
}
}
}
4.重点:要把窗体的KeyPriview设置属性为true,键盘绑定事件才会生效