2010-07-28 11 views
7

Moja aplikacja C# ma comboBox ze zdarzeniem SelectedIndexChanged. Zazwyczaj chcę, aby to wydarzenie zostało wywołane, ale czasami potrzebuję, aby wydarzenie się nie rozpaliło. Moja comboBox jest listą plików MRU. Jeśli plik na liście nie istnieje, element zostaje usunięty z comboBox, a wartość comboBoxSelectedIndex jest ustawiona na zero. Jednak ustawienie wartościSelectedIndex na zero powoduje, że zdarzenie SelectedIndexChanged jest uruchamiane, co w tym przypadku jest problematyczne, ponieważ powoduje uruchomienie kodu UIF w procedurze obsługi zdarzeń. Czy istnieje elegancki sposób wyłączania/włączania zdarzeń dla formantów formularza C#? Dzięki.Modyfikowanie ComboBox SelectedIndex bez wywoływania zdarzenia w C#

Odpowiedz

11

Zacznij metodę Podprogram z

ComboBox combo = sender as ComboBox; 
if (combo.SelectedIndex == 0) 
{ 
    return; 
} 

jeśli masz problem jest z innym eventhandler można usunąć rejestrację zdarzeń eventhandler pierwszy.

combo.SelectedIndexChanged -= EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
combo.SelectedIndex = 0; 
combo.SelectedIndexChanged += EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
1

One (dość brzydki) sposobem byłoby ustawić flagę w kodzie, który usuwa wpis, a następnie sprawdzić, czy w SelectedIndexChanged Handler:

if (!deletedEntry) 
{ 
    // Do stuff 
} 
deletedEntry = false; 

Lepszym sposobem może być usunięcie swoje SelectedIndexChanged funkcja obsługi zdarzenia na początku metody usuwania i przywróć ją na końcu. W ten sposób kod nie będzie wiedział, że indeks się zmienił.

8

Napotkałem to wiele razy przez te wszystkie lata. Moim rozwiązaniem jest posiadanie zmiennej poziomu klasy o nazwie _noise i jeśli wiem, że mam zamiar zmienić indeks kombi lub jakiejkolwiek innej podobnej kontroli, która uruchamia się po zmianie wybranego indeksu, robię co następuje w kodzie.

private bool _noise; 

Oto kod do obsługi zdarzeń kontrola

private void cbTest_SelectedIndexChange(object sender, EventArgs e) 
{ 
    if (_noise) return; 

    // process the events code 

    ... 

} 


wtedy, gdy wiem, mam zamiar zmienić indeks, mam następujące:

_noise = true; // cause the handler to ignore the noise... 


cbTest.Index = value; 


_noise = false; // let the event process again 
3

Jestem zaskoczony, że nie ma lepszego sposobu na zrobienie tego, ale tak to robię. Właściwie używam pola Tag większości kontrolek, więc nie muszę podklasy kontrolować. I używam /null jako wartości, ponieważ null jest domyślne.

Oczywiście, jeśli rzeczywiście przy Tag, trzeba to zrobić inaczej ...

W Handler:

private void control_Event(object sender, EventArgs e) 
{ 
    if (control.Tag != null) return; 

    // process the events code 

    ... 

} 

W kodzie głównym

try 
{ 
    control.Tag = true; 
    // set the control property 
    control.Value = xxx; 
or 
    control.Index = xxx; 
or 
    control.Checked = xxx; 
    ... 
} 
finally 
{ 
    control.Tag = null; 
} 
Powiązane problemy