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

しかし、ボタンを1回押してから、もう一度新しいコントロールに移動したい場合はどうすればよいですか?このProcessCmdKeyを手動で呼び出す方法はありますか?

于 2010-01-25T07:11:06.147 に答える