3
this.textBox1.Enter += new System.EventHandler(this.textBox1_Enter);

(...)

int test = 0;
private void textBox1_Enter(object sender, EventArgs e)
{
    ///
    /// update completion from db
    ///

    ++test;
    Log("got focus " + test);
}

ログステートメントから次の結果が得られます。

[03/08/2013 13:56:40]: フォーカス 1 を取得
[03/08/2013 13:56:40]: フォーカス 2 を取得

テキスト ボックスをクリックするたびに、この関数が 2 回呼び出されるのはなぜですか?

確認済み: この関数への参照は 1 つしかありません。

編集:

実際の関数はそのように見えます

private void textBox1_Enter(object sender, EventArgs e)
{
    // update completion
    List<string> allValues = getValuesFromDb();
    myAutoComplete = new AutoCompleteStringCollection();
    myAutoComplete.AddRange(allValues.ToArray());
    textBox1.AutoCompleteCustomSource = myAutoComplete; /// this line calls enter event again

    ++test;
    Log("got focus " + test);
}
4

1 に答える 1

2

質問が解決しました。理由はわかります。呼び出し:

textBox1.AutoCompleteCustomSource = myCustomSource;

enter イベントを再度呼び出します。

では、それを防ぐ方法は?

1) (動作しない) 最初の解決策: 次のコードを別の場所に移動します。

textBox1.AutoCompleteCustomSource =...

良くない: オートコンプリートが更新されていません

2)(作業中)ロックを

 int test = 0;
 bool lockEnter = false;
 private void textBox1_Enter(object sender, EventArgs e)
 {
  if (!lockEnter)
  {
    lockEnter = true;

    // update completion
    List<string> allValues = getValuesFromDb();
    myAutoComplete = new AutoCompleteStringCollection();
    mtAutoComplete.AddRange(allValues.ToArray());
    textBox1.AutoCompleteCustomSource = myAutoComplete;

    ++test;
    Log("update completion " + test);

    lockEnter = false;
  }

}

例外を与える。

ありがとうございます!

于 2013-08-03T04:04:25.067 に答える