2010-07-28 16 views
7

Meine C# -Anwendung hat eine comboBox mit einem SelectedIndexChanged Ereignis. Normalerweise möchte ich, dass dieses Ereignis ausgelöst wird, aber manchmal muss das Ereignis nicht ausgelöst werden. Meine comboBox ist eine MRU-Dateiliste. Wenn eine Datei in der Liste nicht existiert, wird das Element aus comboBox entfernt und comboBoxSelectedIndex wird auf Null gesetzt. Wenn Sie jedoch comboBoxSelectedIndex auf Null setzen, wird das Ereignis SelectedIndexChanged ausgelöst, was in diesem Fall problematisch ist, da einige UIF-Codes im Ereignishandler ausgeführt werden. Gibt es eine elegante Möglichkeit, Ereignisse für C# -Formularsteuerelemente zu deaktivieren/aktivieren? Vielen Dank.Ändern von ComboBox SelectedIndex ohne auslösendes Ereignis in C#

Antwort

11

die Eventhandler Methode Beginnen Sie mit

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

Wenn Sie Problem mit einem anderen Eventhandler ist zunächst die Eventhandler Veranstaltung Registrierung entfernen könnte.

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

One (ziemlich hässlich) Art und Weise einen Flag im Code zu setzen wäre, dass der Eintrag gelöscht und dann, dass der Check in den SelectedIndexChanged Handler:

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

Eine bessere Möglichkeit, Ihre sein könnte zu entfernen SelectedIndexChanged Event-Handler am Anfang der Löschmethode und wieder am Ende. Auf diese Weise wissen Sie nicht, dass sich der Index geändert hat.

8

Ich habe dies viele Male im Laufe der Jahre angetroffen. Meine Lösung ist eine Klassenvariable namens _noise, und wenn ich weiß, dass ich den Index der Combo oder eines anderen ähnlichen Steuerelements ändern möchte, das ausgelöst wird, wenn sich der ausgewählte Index ändert, mache ich Folgendes im Code.

private bool _noise; 

Hier ist der Code für die Steuerereignishandler

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

    // process the events code 

    ... 

} 


Dann, wenn ich weiß, ich werde den Index ändern, ich folgendes:

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


cbTest.Index = value; 


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

Ich bin überrascht, dass es keinen besseren Weg dafür gibt, aber so mache ich es. Ich benutze tatsächlich das Feld Tag der meisten Steuerelemente, so dass ich das Steuerelement nicht unterklassifizieren muss. Und ich verwende true/null als die Werte, da null der Standardwert ist.

Natürlich, wenn Sie tatsächlich Tag verwenden, müssen Sie es anders machen ...

In Handler:

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

    // process the events code 

    ... 

} 

Im Hauptcode

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