C# - 允许使用箭头键切换输入字段
C# - Allow switching of input fields using arrow keys
我有一个 C# Windows 表单应用程序,它使用 10 个文本框作为输入字段,我希望能够对这些进行编程,以便任何具有焦点的文本框都可以具有向上箭头(Keys.Up
) 或向下箭头 (Keys.Down
) 可以按下,焦点将跳转到下一个或上一个文本框。
到目前为止我打算使用这样的东西:
if (e.KeyChar == Convert.ToChar(Keys.Up))
{
GetNextControl((TextBox)sender, false);
}
else if (e.KeyChar == Convert.ToChar(Keys.Down))
{
GetNextControl((TextBox)sender, true);
}
我唯一担心的是这是否会干扰实际文本的输入。上面的代码是否需要更改为类似下面的代码?
if (e.KeyChar == Convert.ToChar(Keys.Up))
{
GetNextControl((TextBox)sender, false);
}
else if (e.KeyChar == Convert.ToChar(Keys.Down))
{
GetNextControl((TextBox)sender, true);
}
//any other key pressed
else
{
TextBox input = (TextBox)sender;
//add char relating to pressed key to text in TextBox
input.AppendText(e.KeyChar.ToString());
}
这个 else
子句是必需的还是 TextBox
的默认操作会处理这种情况?
谢谢,
马克
Up 键的 e.KeyChar
是什么?不要使用char
,而是使用关键代码:
private void myTextBoxes_KeyDown(object sender, KeyEventArgs e) {
// KeyCode: there're no reasonable chars after "Up" or "Down" keys
if (e.KeyCode == Keys.Up) {
e.Handled = true; // to prevent system processing
// (Control): what if you want to add, say, RichEdit into the pattern?
GetNextControl((Control) sender, false);
}
else if (e.KeyCode == Keys.Down) {
e.Handled = true; // to prevent system processing
GetNextControl((Control) sender, true);
}
}
听起来是个不错的计划。对于您的示例,它将起作用。
为了使其更加通用(不仅适用于文本框),我建议您阅读有关 PreviewKeyDown 事件的信息(理由:在某些控件中,up/down 键将永远不要触发 KeyDown 事件,尽管它适用于文本框)。
至于 GetNextControl,使用 FindForm().SelectNextControl() 可能会有所帮助,因为它将允许对跳过的内容进行更精细的控制。
p.s。另外... GetNextControl 将 return 控件。但不会跳到它。你必须添加 .Focus() 到它。
我有一个 C# Windows 表单应用程序,它使用 10 个文本框作为输入字段,我希望能够对这些进行编程,以便任何具有焦点的文本框都可以具有向上箭头(Keys.Up
) 或向下箭头 (Keys.Down
) 可以按下,焦点将跳转到下一个或上一个文本框。
到目前为止我打算使用这样的东西:
if (e.KeyChar == Convert.ToChar(Keys.Up))
{
GetNextControl((TextBox)sender, false);
}
else if (e.KeyChar == Convert.ToChar(Keys.Down))
{
GetNextControl((TextBox)sender, true);
}
我唯一担心的是这是否会干扰实际文本的输入。上面的代码是否需要更改为类似下面的代码?
if (e.KeyChar == Convert.ToChar(Keys.Up))
{
GetNextControl((TextBox)sender, false);
}
else if (e.KeyChar == Convert.ToChar(Keys.Down))
{
GetNextControl((TextBox)sender, true);
}
//any other key pressed
else
{
TextBox input = (TextBox)sender;
//add char relating to pressed key to text in TextBox
input.AppendText(e.KeyChar.ToString());
}
这个 else
子句是必需的还是 TextBox
的默认操作会处理这种情况?
谢谢, 马克
Up 键的 e.KeyChar
是什么?不要使用char
,而是使用关键代码:
private void myTextBoxes_KeyDown(object sender, KeyEventArgs e) {
// KeyCode: there're no reasonable chars after "Up" or "Down" keys
if (e.KeyCode == Keys.Up) {
e.Handled = true; // to prevent system processing
// (Control): what if you want to add, say, RichEdit into the pattern?
GetNextControl((Control) sender, false);
}
else if (e.KeyCode == Keys.Down) {
e.Handled = true; // to prevent system processing
GetNextControl((Control) sender, true);
}
}
听起来是个不错的计划。对于您的示例,它将起作用。
为了使其更加通用(不仅适用于文本框),我建议您阅读有关 PreviewKeyDown 事件的信息(理由:在某些控件中,up/down 键将永远不要触发 KeyDown 事件,尽管它适用于文本框)。
至于 GetNextControl,使用 FindForm().SelectNextControl() 可能会有所帮助,因为它将允许对跳过的内容进行更精细的控制。
p.s。另外... GetNextControl 将 return 控件。但不会跳到它。你必须添加 .Focus() 到它。