"SelectedIndexChanged" feuert nicht nach "Items.Clear ()" in ListBox

8

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?

    
Shmuel Valariola 30.03.2011, 20:39
quelle

4 Antworten

5

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.

    
dlev 30.03.2011, 20:48
quelle
2

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

    
Mr. Young 30.03.2011 20:51
quelle
1

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.

    
Eli Braginskiy 12.04.2011 21:53
quelle
0

Das ist mein Weg, es ist kompatibel mit existierendem Code.

%Vor%     
IlPADlI 14.03.2014 03:05
quelle