4

VS2010 C#.Net 4.1

ユーザーが初期データを選択または入力する必要があるフォームに取り組んでいますComboBoxTab推測に時間がかかった以下のコードを使用して、データが正しい場合はユーザーがキーを押したときに[編集]ボタンを有効にします。そうでない場合は、ボタンを無効にして次のボタンに移動します。

このコードは機能しますが、 truePreviewKeyDownに設定するとイベントが再発するという副作用があります。IsInputKeyこれにより、検証が2回呼び出されます。KeyDownイベントは1回だけ呼び出されIsInputKey、2回目の呼び出しで再びfalseになるため、検証を再度確認する必要があります。

理由を理解し、おそらくそれを避けたいと思います。

private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { 
  if (e.KeyData == Keys.Tab) { 
    if (ValidationRoutine()) { 
      e.IsInputKey = true;  //If Validated, signals KeyDown to examine this key 
    } //Side effect - This event is called twice when IsInputKey is set to true 
  }           
} 

private void comboBox1_KeyDown(object sender, KeyEventArgs e) { 
  if (e.KeyData == Keys.Tab) { 
      e.SuppressKeyPress = true; //Stops further processing of the TAB key 
      btnEdit.Enabled = true; 
      btnEdit.Focus(); 
  } 
} 
4

1 に答える 1

5

なぜですか?答えるのは難しいですが、Winformsは答えるだけです。最初にメッセージループから、再びコントロールのメッセージディスパッチャーから。このイベントは、実際には、制御クラスをオーバーライドすることなく、保護されたIsInputKey()メソッドを実装するための代替方法として意図されていました。ちょっとしたハックですが、私は常にイベントをオーバーライドし、使用したことはありません。

より良いネズミ捕りは、代わりにProcessCmdKey()をオーバーライドすることです。このような:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (this.ActiveControl == comboBox1 && keyData == Keys.Tab) {
            if (ValidationRoutine()) {
                btnEdit.Enabled = true;
                btnEdit.Focus();
                return true;
            }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
于 2012-08-10T15:02:06.357 に答える