2013-08-03 31 views
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); 
} 

我得到这样的结果从我的日志语句:为什么我的textBox_enter事件(焦点)在这里调用两次?

[2013年3月8日十三点56分40秒]:有重点1
[2013年3月8日十三点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

我这样做。我应该看到什么? – mickro

+1

这应该给你一个线索,说明它为什么被调用两次以及谁调用它。只需在您的事件处理程序中放置一个断点并在两个调用中检查堆栈跟踪。 –

回答

1

的问题解决了,我知道这是为什么。电话:

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

}

给出结果例外。

谢谢你们!

相关问题