Laden...

Listview: ItemSelectionChanged

Erstellt von syn87 vor 15 Jahren Letzter Beitrag vor 14 Jahren 5.206 Views
S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren
Listview: ItemSelectionChanged

Hallo zusammen,

wiedermal eine Frage bzgl der (fuer mich) verwirrenden Events. Ich hab schon ein bisschen rumgelesen und grundlegend kann ich ja verstehen, dass es so gemacht wurde. Allerdings hab ich zeitweise erhebliche Probleme wenn das ItemSelectionChanged-Event beim wechsel der selektion 2 mal feuert.

Szenario in meinem fall:
ich habe eine Listview und eine eigenschaftsgroupbox. ist ein element selektiert soll die groupbox enabled sein, ansonsten disabled. vllt kann man sich jetzt schon denken, dass beim selektionswechsel die groupbox kurz flackert weil sie halt kurz auf disabled gesetzt wird. meine einzige loesung besteht darin mit dem ersten feuern einen timer zu starten, der dann kurz danach nochmal auf listview.SelectedItems.Count > 0 prueft.

LG

syn87

40 Beiträge seit 2007
vor 15 Jahren

Vielleicht bist du mit

SelectedIndexChanged

besser dran.

ItemSelectionChanged feuert zwei mal da ein Item abgewählt und ein anderes angewählt wird. Eventuell könntest du überprüfen ob das zurückgelieferte Item tatsächlich einem neuen Ausgewähltem entspricht und nur dann deine Combobox ändern.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo syn87,

warum ItemSelectionChanged zweimal gefeuert wird, hat ja Rumpel schon gesagt.

Deshalb brauchst du aber doch keinen Timer. Es reicht in ItemSelectionChanged auf listview.SelectedItems.Count > 0 zu prüfen.

herbivore

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren

thanks for your guidance 🙂 ich werds gleich ausprobieren.

Gruß

syn87

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren

Also ich habs ausprobiert und es zeigt noch nicht den gewuenschten Effekt.

Sowohl ItemSelectionChanged als auch SelectedIndexChanged feuern beim Wechsel eines Elements 2 mal. Dabei signalisieren sie zuerst den Zustand, dass kein Item selektiert ist und beim naechsten Feuern dann das ausgewählte. Folge ist, dass meine Groupbox flackert, da ich sie deaktivieren moechte falls kein Element ausgewählt ist. Die Prüfung auf SelectedItems.Count > 0 verwende ich bereits!

Gruß

5.299 Beiträge seit 2008
vor 15 Jahren

Pest, du hast recht!
Also Listview kann einem wirklich auf die Nerven gehen (nimm dgv). Ansonsten kann mans noch entkoppeln:


      private void listView1_SelectedIndexChanged(object sender, EventArgs e) {
         Application.Idle += new EventHandler(Application_Idle);
      }

      void Application_Idle(object sender, EventArgs e) {
         Application.Idle -= new EventHandler(Application_Idle);
         this.groupBox1.Enabled = listView1.SelectedIndices.Count > 0;
      }

mit bischen Vorsicht genießen, hierdurch wird die Reihenfolge von Ereignissen verändert.

Der frühe Apfel fängt den Wurm.

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 15 Jahren

Nach etwas aehnlichem hab ich genau gesucht! Ich habs u.a. mit Application.DoEvents() probiert und dachte, dadurch kommt das zweite Feuern vllt eher dran, aber nix wahr 🙁

Ich probiers nachher aus und meld mich dann nochmal 🙂

U
208 Beiträge seit 2008
vor 15 Jahren

Ich weiß, dass der Thread schon über drei Monate als ist, aber da ich mich eben mit dem gleichen Problem konfrontiert sah, erscheint es mir angebracht, das ganze noch mal hochzubringen.

Das Problem an der Sache mit dem zweimal ausgelöstem Ereignis ist ja nur dann relevant, wenn man den Zustand, dass kein Eintrag in der ListView ausgewählt ist auch behandeln möchte.
Bei mir werden z.B. einige Controls deaktiviert, wenn kein ListView-Eintrag ausgewählt ist. In dem Fall kommt es zum hässlichen Flackern beim Auswählen eines anderen Elements, wenn schon eins ausgewählt war, da zwischenzeitlich das SelectedIndexChanged/SelectedItemChanged-Ereignis ausgelöst wurde, um die Deselektierung des vorherigen Elements zu kennzeichnen.

Ich hab jetzt herausgefunden, dass, wenn das Ereignis aufgrund einer vorherigen Deselektierung ausgelöst wird, die Eigenschaft FocusedItem der ListView auf null steht (bzw. in meinem Fall war es Nothing, da ich hier bei der Arbeit VB.NET benutze). Das ist aber nicht der Fall, wenn der Anwender die Auswahl im ListView zurückgesetzt hat, indem er auf eine leere Fläche im ListView geklickt hat.

Mit dem Wissen kann man dann einfach direkt am Anfang seiner Funktion die Verarbeitung abbrechen, wenn FocusedItem auf null/Nothing steht.

Ich hoffe das hilft später irgendjemandem mal weiter. Ich hab selbst zuvor lange gegoogelt aber wirklich keine "saubere" Lösung gefunden. Jedesmal wurde irgendetwas mit einem Timer gemacht.

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 14 Jahren

Hi,

ich möchte an dieser Stelle auf eine sehr schöne Bibliothek von codeproject.com hinweisen:

http://www.codeproject.com/KB/tree/treeviewadv.aspx

In diesem ist unter anderem das Selektions-Problem gelöst.

Danke aber auch an Isaac 😃