2013-08-03 2 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 (с фокусом) называется здесь дважды?

[03/08/2013 13:56:40] получил фокус 1
[03/08/2013 13:56:40] : получил фокус 2

Почему эта функция называется дважды каждый раз, когда я нажимаю в своем текстовом поле?

Я уже проверил: у меня есть только одна ссылка на эту функцию.

Edit:

вещественная функция выглядит так

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

указать результат.

Спасибо вам, ребята!

Смежные вопросы