C# 为什么我的文本框输入事件(聚焦)在这里调用了两次?

C# 为什么我的文本框输入事件(聚焦)在这里调用了两次?,c#,events,textbox,C#,Events,Textbox,我从日志语句中得到以下结果: [03/08/2013 13:56:40]:获得焦点1 [03/08/2013 13:56:40]:获得焦点2 为什么每次单击文本框时都会调用此函数两次 我已经检查过了:我只有一个对这个函数的引用 编辑: 实函数看起来更像这样 this.textBox1.Enter += new System.EventHandler(this.textBox1_Enter); (...) int test = 0; private void textBox1_Enter(ob

我从日志语句中得到以下结果:

[03/08/2013 13:56:40]:获得焦点1
[03/08/2013 13:56:40]:获得焦点2

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

我已经检查过了:我只有一个对这个函数的引用

编辑:

实函数看起来更像这样

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);
}
private void textBox1\u输入(对象发送者,事件参数e)
{
//更新完成
列出所有值=getValuesFromDb();
myAutoComplete=新的AutoCompleteTestringCollection();
myAutoComplete.AddRange(allValues.ToArray());
textBox1.AutoCompleteCustomSource=myAutoComplete;///此行再次调用enter事件
++试验;
日志(“获得焦点”+测试);
}

问题解决了,我知道原因。电话:

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);
}
再次调用enter事件

那么现在如何预防呢

1) (不工作)第一种解决方案:将以下代码移到别处

textBox1.AutoCompleteCustomSource = myCustomSource;
不好:自动完成未更新

2) (工作)把一把锁当作

textBox1.AutoCompleteCustomSource =...
int测试=0;
bool lockEnter=false;
私有无效文本框1\u输入(对象发送方,事件参数e)
{
如果(!锁定输入)
{
lockEnter=true;
//更新完成
列出所有值=getValuesFromDb();
myAutoComplete=新的AutoCompleteTestringCollection();
mtAutoComplete.AddRange(allValues.ToArray());
textBox1.AutoCompleteCustomSource=myAutoComplete;
++试验;
日志(“更新完成”+测试);
lockEnter=false;
}
}

给出例外的结果


谢谢你们

您检查了这两个调用的堆栈跟踪了吗?这应该给您一个线索,说明为什么它被调用了两次&是谁在调用它。只需在事件处理程序中放置一个断点并检查两个调用中的堆栈跟踪。第一行是来自
InitializeComponent
?或者您手动注册事件处理程序?他可能为事件注册了两次。@AdelKhayata,谢谢我收到了:textBox1.AutoCompleteCustomSource=。。。
 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;
  }