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() 到它。