Bei einer ListBox (wenn der Auswahlmodus auf Eins gesetzt ist) möchte ich verfolgen, ob ein ausgewähltes Element oder keines ausgewählt ist. Dazu habe ich SelectedIndexChanged eine Methode abonniert und überprüft, ob SelectedIndex -1 ist oder nicht. Mir ist jedoch aufgefallen, dass das Ereignis nach dem Aufruf von Items.Clear () nicht ausgelöst wird, obwohl SelectedIndex auf -1 wechselt (wenn es nicht bereits -1 war).
Warum feuert es nicht? Ich weiß, dass ich das umgehen kann, indem ich SelectedIndex -1 zuweise, bevor ich die Liste lösche. Aber gibt es einen besseren Weg?
Hier ist ein einfacher Code, um dies zu replizieren:
%Vor%Bearbeiten: Ich überlege, eine benutzerdefinierte Liste zu erstellen, indem Sie eine Klasse erstellen, die von ListBox erbt, oder indem Sie ein Benutzersteuerelement erstellen. Ich bin mir jedoch nicht sicher, wie ich das angehen soll. Irgendwelche Ideen zum Verbergen / Überschreiben der Clear-Methode mit vererbung / userControl? Wäre es erforderlich, andere Methoden zu verstecken / zu überschreiben oder gibt es eine Möglichkeit, dies zu vermeiden?
Wenn Sie sich den Code in Reflector ansehen, setzt die Clear () -Methode auf Items nur die interne Objektliste des .Net-Objekts zurück (und nicht, wie Sie bemerkt haben, OnSelectedIndexChanged).
Die SelectedIndex-Eigenschaft gibt -1 zurück, da die Logik im Getter der Eigenschaft vorgibt, dass -1 zurückgegeben werden soll, wenn sich keine Elemente in der internen Liste befinden.
Clear () löscht nur die interne Sammlung des Steuerelements. Clear () löst das SelectedIndexChanged-Ereignis nicht aus, da dieses Ereignis nur durch Ändern des CurrentSelectedIndex ausgelöst wird. Versuchen Sie es stattdessen mit lst. ClearSelected (). Der Aufruf dieser Methode entspricht dem Setzen der SelectedIndex-Eigenschaft auf eine negative (-1). Sie können diese Methode verwenden, um alle Elemente in der Liste schnell zu deaktivieren. Alternativ können Sie versuchen, Items.Clear () aufzurufen und mit einem Aufruf von ListBox zu folgen. RefreshItems
wahrscheinlich eine hackische Lösung, aber das ist, woran ich gedacht habe:
%Vor%als Sie dies in Ihrem Hauptformular so nennen können:
%Vor%vielleicht könnte das dein Problem lösen.
Tags und Links c# winforms listbox selectedindexchanged