2

我想为表单上所有可用的控件运行一个通用的 KeyDown 偶数处理程序。我有什么办法可以做到这一点?

更清楚地说,我的意图是在按下 Enter 键时检测它,并将焦点从当前控件移动到具有下一个 TabIndex 的控件。

我怎样才能做到这一点?

4

3 回答 3

2

您必须避免妨碍正常使用 Enter 键。这应该很接近:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == Keys.Enter && this.AcceptButton == null && this.ActiveControl != null) {
    TextBoxBase box = this.ActiveControl as TextBoxBase;
    if (box == null || !box.Multiline) {
      // Not a dialog, not a multi-line textbox; we can use Enter for tabbing
      this.SelectNextControl(this.ActiveControl, true, true, true, true);
      return true;
    }
  }
  return base.ProcessCmdKey(ref msg, keyData);
}
于 2010-01-24T20:16:02.657 回答
1

覆盖表单的ProcessCmdKey方法。

于 2010-01-24T20:05:07.613 回答
0

实际上 ProcessCmdKey 不会出现在表单事件列表下,所以不能更早地使用它。^_^

我进行了一些编辑并对其进行了修改以检测是否有任何按钮可用,如果有,它不会移动焦点,而是按下按钮..

Button b = this.ActiveControl as Button;
        if (keyData == Keys.Enter && this.AcceptButton == null && this.ActiveControl != null && !this.ActiveControl.Equals(b))
        {

            TextBoxBase box = this.ActiveControl as TextBoxBase;

            if (box == null || !box.Multiline)
            {
                // Not a dialog, not a multi-line textbox; we can use Enter for tabbing
                this.SelectNextControl(this.ActiveControl, true, true, true, true);
                return true;
            }
        }
        return base.ProcessCmdKey(ref msg, keyData);

但是如果我想按一次按钮然后再次移动到新控件怎么办?有没有办法手动调用这个 ProcessCmdKey ?

于 2010-01-25T07:11:06.147 回答