2009-11-19 5 views
0

У меня есть форма для окон. Он имеет ComboBox и DataGridОтмена событий Windows Forms

У меня есть Leave событие на моем ComboBox и у меня есть DoubleClick событие в моей DataGrid строке

Идея в том, что на выходе из ComboBox, если значение ComboBox изменилось, то используйте новое значение для перезагрузки DataGrid.

Предположим, что ComboBox отображает значение 1, и для этого значения в DataGrid отображается 5 записей. Теперь пользователь вводит 2 в ComboBox и заносит закладки. В моем Leave событиях я вижу, что значение изменилось, и я перезагрузил DataGrid со всеми записями для этого значения.

Но если пользователь вводит 2 и двойные щелчки на существующих записях значения 1, чем событие отпуска перезагружает DataGrid и чем DoubleClick ПОЖАРОВ событий.

Как найти список ожидающих событий и отменить все их из них, если DataGrid был перезагружен?

ответ

1

У вас возникла проблема с заказом событий, событие DataGridView.Enter срабатывает слишком рано. Это может быть чисто решено путем задержки действий события с помощью метода Control.BeginInvoke(). Его цель для делегата срабатывает, как только ваша программа снова войдет в цикл сообщений. Другими словами, после завершения всех ожидающих событий. Сделать это выглядит примерно так:

private bool selectionDirty; 

private void comboBox1_TextChanged(object sender, EventArgs e) { 
    selectionDirty = true; 
} 

private void dataGridView1_Enter(object sender, EventArgs e) { 
    this.BeginInvoke(new Action(() => selectionDirty = false)); 
} 

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { 
    if (selectionDirty) return; 
    // etc... 
} 
+0

Я попробую в понедельник утром – CodingJoy

+0

Я не думаю, что это сработает. потому что при входе в datagrid нет гарантии, что он был перезагружен. – CodingJoy

+0

Мне нужен Джон Скит или Айенде, чтобы помочь мне – CodingJoy

1

Вместо того, чтобы использовать Leave событие, попробуйте SelectedIndexChanged Event, что уволят, прежде чем до DataGrid сек DoubleClick события. Недостатком является то, что пользователь прокручивает ComboBox с помощью клавиатуры, затем он срабатывает 5 раз, если пользователь прокручивает 5 шагов вниз в ComboBox.

Другим решением было бы хранить локальную переменную lComboEntered=true при входе в ComboBox и установить значение false, когда Leave пожаров событий. И в событии DataGridDoubleClick проверьте, действительно ли lComboEntered=false ничего не сделал.

+0

В моем рутинным отпуска, если значение выпадающий изменилось, чем я перезагрузить DataGrid и установить CancelDoubleClick флаг в TRUE. В моей двоичной программе datagrid я проверяю этот флаг и отменяю событие, если оно истинно. Это отлично работает, если я изменяю значение в своем поле со списком и дважды щелкаю строку, не делая ничего другого. Но если я ввожу значение в поле со списком и просто откладываю, то я должен дважды щелкнуть Datagrid TWICE. где еще. Могу ли я сбросить этот флаг до FALSE. – CodingJoy