为什么我的textBox_enter事件(重点关注)在这里调用了两次?

时间:2013-08-03 02:53:19

标签: c# events textbox

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

为什么每次单击文本框时都会调用此函数两次?

我已经检查过:我只有一个对此功能的引用。

编辑:

真正的功能看起来更像是

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

1 个答案:

答案 0 :(得分:2)

问题解决了我知道为什么。打电话:

textBox1.AutoCompleteCustomSource = myCustomSource;

再次致电输入活动

那么现在该如何预防?

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

}

给出结果除外。

谢谢你们!