2010-01-24 6 views
2

Я хочу запустить обычный обработчик KeyDown для всех элементов управления, доступных в форме. любым способом я могу это сделать?Есть ли способ универсального обработчика KeyDown и перемещения Focus с помощью TabIndex в C# .NET?

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

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

+0

Вы используете WinForms или WPF? –

ответ

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); 

Но WhatIf я хотите нажать кнопку один раз, а затем снова перейти к новому элементу управления? Есть ли способ вызвать этот ProcessCmdKey вручную?

2

Вам не придется мешать регулярному использованию клавиши «Ввод». Это должно быть близко:

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); 
}