ListView sortiert letztes Element nicht



  • Hallo Leute,

    ich habe hier ein komisches Verhalten bei einer ListView entdeckt:

    Wenn die ListView automatisch alle hinzugefügten Elemente sortieren soll funktioniert das, bis auf beim letzten Element.

    Hier mal der Beispielcode:

    private int i = 0;
    
            private void button1_Click(object sender, EventArgs e)
            {
                ListViewItem lvi1 = new ListViewItem("bbb" + (i++).ToString());
                ListViewItem lvi2 = new ListViewItem("ccc" + (i++).ToString());
                ListViewItem lvi3 = new ListViewItem("aaa" + (i++).ToString());
                lvi1.Group = listView1.Groups[0];
                lvi2.Group = listView1.Groups[1];
                lvi3.Group = listView1.Groups[1];
                listView1.Items.Add(lvi1);
                listView1.Items.Add(lvi2);
                listView1.Items.Add(lvi3);
    
                listView1.Sort(); // bringt leider nichts
    
                //das ist meine bisherige Lösung:
    
                ListViewItem lvitemp = new ListViewItem("temp");
                listView1.Items.Add(lvitemp);
                listView1.Items.Remove(lvitemp);
            }
    

    Es reicht dazu ein simples Form zu erstellen, eine ListView drauf zu erstellen und eben einen Button.
    Die ListView hat als View-Property: Details.
    Sort-Einstellung ist Ascending.
    Der ListView habe ich 2 Gruppen hinzugefügt (per GUI Editor).

    Die ListView sortiert bei mir alles korrekt, bis auf das letzte Element.
    Deshalb füge ich nun übergangsweise immer ein temp-Objekt hinzu und entferne es gleich wieder, damit die Liste ganz sortiert ist.

    Aber das ist keine wirklich schöne Lösung ^^

    Wo habe ich einen Fehler gemacht, bzw. wo liegt hier das Problem?
    Denke es müsste nachvollziehbar sein mit einem Beispielprojekt wie oben beschrieben.

    Viele Grüße und vielen Dank für Hilfe



  • Funktioniert doch? Wenn Sorting != None ist, dann werden die Items doch gleich korrekt sortiert.



  • nein, bei mir funktioniert das sortieren nur korrekt wenn ich eben zusätzlich folgende Zeilen drin habe:

    ListViewItem lvitemp = new ListViewItem("temp");
                listView1.Items.Add(lvitemp);
                listView1.Items.Remove(lvitemp);
    

    Funktioniert das Beispiel bei Dir auch ohne diesem Zusatzcode?
    Wenn ja, dann werde ich mal das ganze Projekt hochladen.

    Bei mir wird immer das zuletzt hinzugefügte "aaa(nr)" nicht richtig sortiert, sondern ans Ende gehängt!
    (Drück den Button mal öfter)
    Und aaa muss ja vor bbb und ccc stehen!

    Liegt es evtl. an den Gruppen?

    Gruß



  • Auf was ist das sortieren gestellt ? (Den Post vor Dir aufmerksam gelesen ?)



  • Hallo nochmal.

    Sorting steht auf Ascending.
    Wenn ich keine Gruppen nutze (alle Elemente in Default-Gruppe), dann sortiert er richtig.

    Aber wenn mehrere Gruppen nutze, dann sortiert er das letzte Element falsch.
    Hier der download:
    http://rapidshare.com/files/209801551/Grouptest3.zip.html

    Und hier noch ein Bild:
    http://www.qpic.ws/images/Ko394071.jpg

    Das letzte Element aaa5 ist eben nicht sortiert.

    Danke für Tipps!



  • try
                {
                    listView1.BeginUpdate();
                    ListViewItem lvi1 = new ListViewItem("bbb" + (i++).ToString());
                    ListViewItem lvi2 = new ListViewItem("ccc" + (i++).ToString());
                    ListViewItem lvi3 = new ListViewItem("aaa" + (i++).ToString());
                    lvi1.Group = listView1.Groups[0];
                    lvi2.Group = listView1.Groups[1];
                    lvi3.Group = listView1.Groups[1];
                    listView1.Items.Add(lvi1);
                    listView1.Items.Add(lvi2);
                    listView1.Items.Add(lvi3);
                }
                finally
                {
                    listView1.EndUpdate();                
                }
    


  • wow, DANKE!

    Habe das zwar gesehen, aber dachte das würde keine Auswirkung haben.

    Muss nun nur noch ein listView1.Sort() mit reinsetzen und schon funktionierts immer.

    Was macht denn BeginUpdate() und EndUpdate() für einen Unterschied bei dem Control? (auch wenn der Name für sich selbst spricht)



  • Generell soll BeginUpdate und EndUpdate dafür sorgen, das es schneller geht. Das Control muss dann nicht bei jedem Eintrag neu Zeichnen. Bei der Suche via Google fand ich ein Beitrag der beschrieb, das man die Einträge machen muss bevor man die LV anzeigt. (Group -> Sort) . Ich hab dann Begin und EndUpdate einfach getestet. Ein Invalidate, Refresh und DrawItems(0,lv.Items.Count-1,false); brachte den gewünschten Erfolg nicht.

    Was intern genau passiert oder was man ggf. als Ersatz hätte aufrufen können weiß ich nicht. Googeln oder Reflektor benutzen. Wenn Du es aber raus bekommst, lass es uns wissen.


Anmelden zum Antworten