C# 为什么我的文本框输入事件(聚焦)在这里调用了两次?
我从日志语句中得到以下结果: [03/08/2013 13:56:40]:获得焦点1C# 为什么我的文本框输入事件(聚焦)在这里调用了两次?,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]:获得焦点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;
}