2010-07-28 15 views
7

L'applicazione My C# ha un evento comboBox con un evento SelectedIndexChanged. Di solito, voglio che questo evento esploda, ma a volte ho bisogno che l'evento non venga attivato. Il mio comboBox è un elenco di file MRU. Se si trova che un file nell'elenco non esiste, l'elemento viene rimosso da comboBox e comboBoxSelectedIndex è impostato su zero. Tuttavia, l'impostazione di comboBoxSelectedIndex su zero provoca l'attivazione dell'evento SelectedIndexChanged, che in questo caso è problematico perché causa l'esecuzione di un codice UIF nel gestore eventi. C'è un modo elegante per disabilitare/abilitare gli eventi per i controlli di forma C#? Grazie.Modifica di ComboBox SelectedIndex senza evento di trigger in C#

risposta

11

Avviare il metodo EventHandler con

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

se siete problema è con un EventHandler diverso è possibile rimuovere prima registrazione degli eventi del EventHandler.

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

Un modo (abbastanza brutto) potrebbe essere quella di impostare un flag nel codice che cancella la voce e quindi controllare che nel SelectedIndexChanged gestore:

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

Un modo migliore potrebbe essere quella di rimuovere il SelectedIndexChanged gestore di eventi all'inizio del metodo di eliminazione e ripristinarlo alla fine. In questo modo il codice non saprà che l'indice è cambiato.

8

Ho incontrato questo molte volte nel corso degli anni. La mia soluzione è di avere una variabile di livello di classe chiamata _noise e se so che sto per cambiare l'indice di combo o qualsiasi altro controllo simile che si attiva quando cambia l'indice selezionato, faccio quanto segue nel codice.

private bool _noise; 

Ecco il codice per il gestore di eventi di controllo

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

    // process the events code 

    ... 

} 


Poi quando so che sto andando a modificare l'indice, faccio la seguente:

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


cbTest.Index = value; 


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

Sono sorpreso che non ci sia un modo migliore per farlo, ma questo è il modo in cui lo faccio. In realtà utilizzo il campo Tag della maggior parte dei controlli, quindi non devo sottoclasse il controllo. E io uso true/null come valori, dal momento che null è l'impostazione predefinita.

Naturalmente, se in realtà si sta utilizzando Tag, è necessario farlo in modo diverso ...

In handler:

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

    // process the events code 

    ... 

} 

Nel codice principale

try 
{ 
    control.Tag = true; 
    // set the control property 
    control.Value = xxx; 
or 
    control.Index = xxx; 
or 
    control.Checked = xxx; 
    ... 
} 
finally 
{ 
    control.Tag = null; 
} 
Problemi correlati