2009-04-13 13 views
29

Jak tymczasowo wyłączyć obsługę zdarzeń w WinForms?WinForms: tymczasowo wyłączyć moduł obsługi zdarzeń

+0

Czy możesz dzielić się tym, co robisz na wyższym poziomie? Ponieważ prawdopodobnie nie chcesz wyłączać funkcji obsługi zdarzeń _ALL_ (domyślne narzędzia do rysowania i przenoszenia formularza przychodzą na myśl). –

+0

Po prostu nie chcę przechwytywać zmian w stanie kontroli podczas aktualizacji programowej. I tak, nie chcę wyłączać funkcji obsługi zdarzeń _ALL_, po prostu "program obsługi zdarzeń". http://stackoverflow.com/questions/744436/winforms-two-way-textbox-problem – George

Odpowiedz

47

Prawdopodobnie najprostszym sposobem (który nie wymaga wypisywania lub inne rzeczy) jest zadeklarować wartość logiczną i sprawdzić go na początku Handler:

bool dontRunHandler; 

void Handler(object sender, EventArgs e) { 
    if (dontRunHandler) return; 

    // handler body... 
} 
+2

To jest proste, ale kod będzie bałagan, jeśli często go używasz. – maamaa

40

Wyłącz Z tego co perspektywy? Jeśli chcesz usunąć metodę, która jest w twoim zasięgu z listy delegatów na przewodnika, można po prostu zrobić ..

object.Event -= new EventHandlerType(your_Method); 

To usunie tę metodę z listy uczestników, a można go ponownie podłączyć później z

object.Event += new EventHandlerType(your_Method); 
+5

Myślę, że masz na myśli metodę Your_Method zamiast Your_Method(). Począwszy od C# 2.0, nie potrzebujesz również części "new EventHandlerType" - po prostu object.Event + = yourMethod; i object.Event - = yourMethod; –

+0

Tak, chciałem, żeby to było sans parens;). Nie zdawano sobie jednak sprawy z niejawnej konstrukcji delegatów; dobrze wiedzieć. –

+0

Ten pomysł działa dla mnie (w porównaniu do zaakceptowanej odpowiedzi) w scenariuszu, w którym potrzebowałem tymczasowo wyłączyć Handler dla combobox EditValueChanged. – PhoenixDev

1

Robię to w ten sposób, używając rozszerzenia kontrolnego.

public static void SetDatasource(
    this ComboBox cb, 
    object dataSource, 
    EventHandler _SelectedIndexChanged_eventHandler = null, 
    EventHandler _SelectedValueChanged_eventHandler = null) 
{ 
//disable events 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged -= _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged -= _SelectedValueChanged_eventHandler; 
    if (cb.InvokeRequired) 
    { 
    cb.BeginInvoke(new _d_SetDatasource_ComboBox(SetDatasource), new object[] { cb, dataSource, _SelectedIndexChanged_eventHandler}); 
    } 
    else 
    { 
    cb.DataSource = dataSource; 
    //events enabled again 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged += _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged += _SelectedValueChanged_eventHandler; 
    } 
} 
private delegate void _d_SetDatasource_ComboBox(ComboBox cb, object dataSource, EventHandler _SelectedIndexChanged_eventHandler = null, EventHandler _SelectedValueChanged_eventHandler = null); 
Powiązane problemy