2015-03-13 4 views
1

У меня есть форма Winforms C# с некоторыми кнопками comboBoxes, отмена и сохранение, которые отлично работают. Теперь мне нужно захватить, когда пользователь закончил ввод текста в comboBox. Я добавляю пустое (на данный момент) событие lostFocus (или Leave) в combbox, который срабатывает нормально. Однако, если причиной этого события была нажата кнопка отмены или сохранения, соответствующее событие больше не срабатывает. Эти кнопки все еще работают нормально, если нажать в другое время.Событие с нажатием кнопки не запускается после потерянного события фокуса

Должны ли эти два события срабатывать последовательно или есть лучший способ захватить завершенный ввод текста?

+2

Я говорю, у меня есть 1 триллион долларов, и каждый поверят мне! нет? ... затем поделитесь кодом дорогой, покажите актив, который у вас есть !! – Vikrant

+0

Это должно работать очень хорошо - укажите код своей формы. – bokibeg

+0

У формы есть 700 строк кода, я не могу опубликовать их здесь, и если просто опубликуйте некоторые, я, вероятно, пропущу бит, который вызывает проблему. Есть ли способ отладки процесса события? – Lindsey

ответ

0

Leave и/или LoseFocus события не получить срабатывает, потому что вы не оставляете выпадающий и потому, что не теряет фокус при нажатии Enter или Escape.

Поэтому лучший способ, чтобы добавить функцию вы запускающая в LoseFocus событии, а также к Button кликам событий Cancel- и Accept-Buttons.

Добавление вызова к самому случаю отпуска: comboBox1.Leave(null, null); будет самым простым способом.

Чтобы убедиться, что функция вызывается только один раз, я проверяю, кто имеет фокус в ButtonClick событий:

private void acceptButton_Click(object sender, EventArgs e) 
{ 
    if (comboBox1.ContainsFocus) comboBox1_Leave(acceptButton, null); 
    // do accept stuff here.. 
} 

private void cancelButton_Click(object sender, EventArgs e) 
{ 
    if (comboBox1.ContainsFocus) comboBox1_Leave(cancelButton, null); 
    // do cancel stuff here.. 
} 

private void comboBox1_Leave(object sender, EventArgs e) 
{ 
    // do leave stuff here.. 
    Console.WriteLine(sender); 
} 

Я также пройти в Button, чтобы вы могли проверить sender, чтобы увидеть, как Leave было вызвано ..

0

Я отвечаю на свой собственный вопрос здесь, поскольку я считаю, что это может быть полезно другим новичкам.

Точка останова, которую я установил в своем пустом событии lostFocus, заключалась в прекращении события нажатия кнопки. Когда я удалил точку останова, проблема исчезла.

Однако, когда я добавил код в событие lostFocus, форма перерисовывания иногда перемещала кнопки и предотвращала их срабатывание. Чтобы решить эту проблему, я адаптировал TaWs очень полезный ответ и выпустил событие кнопки из события lostFocus.

private void comboBox1_LostFocus(object sender, EventArgs e) 
{ 
    bool saving = btnSave.ContainsFocus; 

    // form redraw stuff here.. 
    if (saving) 
     btnSave_Click(btnSave, null); 
} 
Смежные вопросы