0

テキストボックスのキーコードを確認していますが、ユーザーがを押したときに特定のタスクを実行したいと考えていますEnter

完全に機能していますが、現在実行しようとしているタスクは、通常、マウスクリックを使用して実行されます。したがって、そのタスク(a FolderBrowserDialog)のOKで、ダイアログコントロールを呼び出し続けます。

奇妙なことに、デバッガーがifブランチに表示しますが、たとえば、表示されますが{KeyData = LButton|MButton|Back}KeyValueそれでも13です。

テキストボックスが最後のエントリを記憶している可能性があると思います...本当ですか?

トラブルシューティングでは、ブール変数を追加したので、それがtrueの場合にのみFolderBrowserにアクセスし、ブラウズ後にテキストボックスにスペースを追加および削除し、テキストボックスをクリアしようとしました...事態はさらに悪化します。

私は準無限ループに入っているように見えましたが、多くの「OK」の後に消えてしまい、ステップスルーすると、テキストボックスに入力するすべての文字について、4〜5ラウンドを費やしていることがわかりました。 CheckKeys。理由がわかりません...またはそれを修正する方法。

「e.Handled」を追加しましたが、ダメでした。

コードは次のとおりです。

private void txtDir_TextChanged(object sender, EventArgs e)
{
  this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys);
}

private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
      if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
      {
          btnBrowse_Click(this, e);
      }
    }           
}

なぜ私はこのチェックを何度も経験するのですか?別のテストを追加できますか?私は何か間違ったことをしていますか?(フォームまたはテキストボックスのデフォルトアクションとして何も設定されていません...)

ありがとうございました。

4

3 に答える 3

1

コードで、TextChangedイベントでKeyUpのハンドラーを追加しました。そのため、TextChangedの場合、KeyUpイベントに新しいハンドラーが追加されます。そのため、各文字が複数回チェックされます。フォームロードイベントにハンドラーを配置します。

たとえば、TextBoxに5文字を入力した場合、KeyUpに5つのハンドラーが追加されます。KeyUpイベントハンドラの数は、TextChangedイベントが呼び出された回数と等しいことを意味します。

this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys); 

これにより、KeyUpイベントの新しいハンドラーが追加されます。したがって、この行を実行すると、新しいハンドラーが追加されます。

フォームロードイベントにハンドラーを配置することにより、複数文字チェックの問題を解決できます。

で試してみてください

private void FormLoad(object sender, EventArgs e)
{
         this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys);
}

private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
  if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
  {
      btnBrowse_Click(this, e);
  }
  }           
}

そしてもう1つあなたのコードを理解しているのでbtnBrowse_Click、TextBoxコントロールでEnterキーを押した場合に実行したいと思います。ただし、KeyUpイベントで処理されないEnterキーでは、キーを処理するためにKeyDownイベントハンドラーが必要ですEnter

コード:

private void FormLoad(object sender, EventArgs e)
{
         this.txtDir.KeyDown += new System.Windows.Forms.KeyEventHandler(CheckKeys);
}

private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
  if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
  {
      btnBrowse_Click(this, e);
  }
  }           
}
于 2012-09-20T03:07:01.360 に答える
1

TextChangedの代わりにKeyDownイベントを使用し、e.Handle=Trueを書き留めます。textBox.KeyDownイベントに次のコードを書き留めます。

if (e.KeyCode == Keys.Enter)
{
   if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
   {
       e.Hanlde = true; //it will be close enter keydown handling at this time
       btnBrowse_Click(this, e);
   }
}    
于 2012-09-20T05:51:27.990 に答える
0

直接交換TextChangedするKeyDownと再び動作します!

(ちなみに、各文字が数回テストされる理由はまだわかりません...)

編集:受け入れられた答えを読んだ後、私は理解しています...

于 2012-09-20T03:01:44.450 に答える