Есть ли способ использовать универсальный обработчик KeyDown и перемещение фокуса с помощью TabIndex в C # .NET? - PullRequest
2 голосов
/ 24 января 2010

Я хочу запустить общий обработчик KeyDown даже для всех элементов управления, доступных в форме. Как я могу это сделать?

Чтобы быть более понятным, я намерен обнаруживать клавишу Enter при каждом ее нажатии и перемещать фокус с текущего элемента управления на элемент со следующим TabIndex.

Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 24 января 2010

Вам не следует мешать регулярному использованию клавиши 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);
}
1 голос
/ 24 января 2010

Переопределить метод формы ProcessCmdKey.

0 голосов
/ 25 января 2010

фактически 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 вручную?

...