Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Listview: ItemSelectionChanged
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

Listview: ItemSelectionChanged

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Rumpel
myCSharp.de - Member

Avatar #avatar-2386.jpg


Dabei seit:
Beiträge: 40
Herkunft: Österreich

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

thanks for your guidance ich werds gleich ausprobieren.

Gruß

syn87
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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ß
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
userid12529
myCSharp.de - Member



Dabei seit:
Beiträge: 208

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von userid12529 am .
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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 :)
private Nachricht | Beiträge des Benutzers