2009-04-13 11 views
29

Come disabilitare temporaneamente un gestore di eventi in WinForms?WinForms: disabilita temporaneamente un gestore di eventi

+0

Puoi condividere quello che stai facendo a un livello superiore? Perché probabilmente non si vogliono disabilitare i gestori di eventi _ALL_ (vengono in mente i gestori di paint e move di default del modulo). –

+0

Semplicemente non voglio rilevare cambiamenti nello stato di un controllo quando lo aggiorno a livello di programmazione. E sì, non voglio disabilitare _ALL_ gestori di eventi, solo "un gestore di eventi". http://stackoverflow.com/questions/744436/winforms-two-way-textbox-problem – George

risposta

47

Probabilmente, il modo più semplice (che non ha bisogno annullamento dell'iscrizione o altre cose) è quello di dichiarare un valore booleano e controllare all'inizio del gestore:

bool dontRunHandler; 

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

    // handler body... 
} 
+2

Questo è semplice, ma il codice sarà un disastro se lo usi spesso. – maamaa

40

Disabilita da quale prospettiva? Se si desidera rimuovere un metodo che è nel vostro campo di applicazione dalla lista dei delegati del gestore, si può solo fare ..

object.Event -= new EventHandlerType(your_Method); 

Questo eliminerà quel metodo dall'elenco dei delegati, e si può ricollegare in un secondo momento con

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

Penso che tu intenda your_Method invece di your_Method(). A partire da C# 2.0, non hai nemmeno bisogno della parte "new EventHandlerType" - solo object.Event + = yourMethod; e object.Event - = yourMethod; –

+0

Sì, intendevo che fosse senza parens;). Non era a conoscenza della costruzione implicita del delegato, però; buono a sapersi. –

+0

Questa idea funziona per me (rispetto alla risposta accettata) nello scenario in cui avevo bisogno di disabilitare temporaneamente il Gestore per una casella combinata ModificaValoreChanged. – PhoenixDev

1

Lo sto facendo in questo modo, utilizzando un'estensione di controllo.

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); 
Problemi correlati