ListView Sortieren



  • Hallo ich habe eine Frage zur sortierung von der listview. Kann man die Daten in der listview auch nach SubItems sortieren?
    Also mein eigentliches Problem ist das ich die größte Zahl die bei den SubItems drinne stehen sortieren will. Ich hoffe mein Problem kam klar rüber.



  • Hallo,

    das ist aufwändiger als man meint 🙂

    1. eine neue Klasse von IComparer ableiten
    2. in der neuen Klasse virtual int Compare(Object ^x, Object ^y )
    überschreiben und je nach Vergleich der jeweiligen Spalte >0, <0 oder 0
    zurückliefern
    3. in deiner Form eine Instanz von der neuen Klasse erstellen und
    ListViewItemSorter Deines Listviews zuordnen.
    4. listView_ColumnClick(...) abfangen und listView->Sort(); aufrufen

    Um möglichst viel abzudecken, sollte man in der neuen Klasse auch die zu sortierende Spalte übergeben, da man neben Zahlen oder Texten z.B. auch Bilder sortieren kann.

    Gruss
    foodax



  • Ok vielen dank erstmal für deine ausführliche Antwort.
    Hätte dann noch eine Frage und zwar wie ich z.B. die geringste Zahl eines SubItems herausfiltern kann und ausgeben.



  • Hallo,

    was das Sortieren angeht, musst Du das nicht selbst herausfinden, denn virtual int Compare(... ) wird solange für zwei Objekte aufgerufen bis die Spalte sortiert ist (vorausgesetzt Deine Rückgabewerte sind korrekt 😉 )

    Solltest Du unabhängig davon bestimmte Werte ermitteln wollen, dann einfach die ListView durchlaufen und die Subitemwerte verarbeiten z.B. :

    for each (ListViewItem ^lvi in listView1->Items)
    {
       // lvi->SubItems[0]->Text
       // mit dem Text irgendwas machen ... Min/Max ...
    }
    

    Gruss
    foodax



  • Danke schön nochmals.
    Aber irgendwie stehe ich auf dem Schlauch.

    if(Convert::ToInt16(lvi->SubItems[0]->Text) > min)
    

    Ich habe jetzt mit if eine Abfrage gestartet aber immer wenn ich auf den Button klicke das er vergleichen soll stürzt mein Programm an dieser Stelle ab.

    Uch hoffe mir kann einer erklären woran das liegt.
    Und danke nochmals.



  • Shashu schrieb:

    Danke schön nochmals.
    Ich habe jetzt mit if eine Abfrage gestartet aber immer wenn ich auf den Button klicke das er vergleichen soll stürzt mein Programm an dieser Stelle ab.

    SubItems[0] ist die erste Spalte. Vielleicht liegt hier Dein Problem?

    Ansonsten sollte das Programm nicht kommentarlos abstürzen sondern eine mehr oder weniger gute Fehlermeldung ausgeben.

    Gruss
    foodax



  • Ok danke nochmals für deine Hilfe und deine Geduld.
    Aber ich blick gar nicht mehr durch irgendwie fehlt mir das verständnis dafür. Hab auch nochma mein Buch durchewälzt und da auch keine Lösung gefunden.
    Ich weis einfach nicht wie ich die einzelnen Items miteinander vergleichen soll. Ich habe es nur hinbekommen das er mir das letzte Item ausgeben soll.
    Aber wie kann ich jeden einzelne Item durchgehen und den kleinsten Wert herausfinden?

    Edit: So ich hab es jetzt noch hinbekommen Zahlen auszugeben aber nur die die kleiner sind als 0. ABer sobald Zahlen über 0 sind werden diese nicht ausgegeben.



  • Hallo,

    poste mal Deinen Quellcode.

    Gruss
    foodax



  • Hallo hier ist jetzt der Quellcode von dem Button der die kleinste DSifferenz ausgeben soll.

    for each(ListViewItem ^lvi in listView1->Items)
    	{		 
    	String^ name;
    	int min;
           int anz=listView1->Items->Count;				 		 
    if(min <= Convert::ToInt16(lvi->SubItems[1]->Text))
    	{
    	min = Convert::ToInt16(lvi->SubItems[1]->Text);
    	name = lvi->Text;
    	}
    lblStatistik->Text = "Der beste ist " +name+ " mit der besten Differenz: " +min;
    	}
    

    Ich hoffe das es überischtlich ist.



  • Hallo,

    Deine Variablen name und min sind lokale Variablen in der for each-Schleife und werden demnach bei jedem Schleifendurchlauf neu erstellt. Die müssen aus der Schleife, genauso wie Deine Ergebnisausgabe.
    Zudem sollte Min noch vorbelegt werden, entweder mit einem Minimalen Wert, den man kennt oder mit dem ersten Eintrag.

    Gruss
    foodax



  • Hallo,

    danke mal wieder für deine Antwort eine kleine Frage hätte ich mal wieder dazu wie ich Min mit dem ersten EIntrag deklarieren kann?

    Gruss Shashu



  • Hallo,

    auch hier zwei Ansätze:

    den Inhalt der 2. Spalte in der ersten Zeile bekommst Du mit:

    listView1->Items[0]->SubItems[1]->Text;
    

    Den Minimalwert einer Variable (hier Int16) bekommst Du mit

    System::Int16::MinValue
    

    bzw. analog auch mit anderen.

    Gruss
    foodax



  • foodax ich bin dir so dankbar :D.
    Habe endlich dank deiner Hilfe alles hinbekommen wie kann ich dir nur danken?

    Ich poste nocheinmal kurz meinen Quellcode wo man aus der 2 Spalte den kleinsten Wert herausfindet.
    Habe es leider nicht mit: System::Int16::MinValue hinbekommen.

    String^ name;
    intmin=Convert::ToInt16(listView1->Items[0]->SubItems[1]->Text);			 
    int anz= listView1->Items->Count;
    
    for(int x=0; x<anz; ++x)
    	{						 if(Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text) < min)
    	{
    	min = Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text);
    	name = listView1->Items[x]->Text;
    	}
    	}
    


  • Shashu schrieb:

    Habe endlich dank deiner Hilfe alles hinbekommen wie kann ich dir nur danken?

    Für jede hilfreiche Antwort anderen 10 x helfen ist Strafe genug? 😃

    String^ name;
    intmin=Convert::ToInt16(listView1->Items[0]->SubItems[1]->Text);			 
    int anz= listView1->Items->Count;
    
    for(int x=0; x<anz; ++x)
    	{						 if(Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text) < min)
    	{
    	min = Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text);
    	name = listView1->Items[x]->Text;
    	}
    	}
    

    Du solltest dann auch den Namen vorbelegen oder im Nachhinein anhand der Position ermitteln oder <= abfragen oder oder ...

    Denn in Deinem Beispiel 'müsste' der Name leer sein, wenn der Minimalwert in der ersten Zeile ist? Habe es nicht getestet aber so vom Bauchgefühl her.

    Gruss
    foodax



  • foodax schrieb:

    Shashu schrieb:

    Habe endlich dank deiner Hilfe alles hinbekommen wie kann ich dir nur danken?

    Für jede hilfreiche Antwort anderen 10 x helfen ist Strafe genug? 😃

    Ok werde ich tun ;).

    Du solltest dann auch den Namen vorbelegen oder im Nachhinein anhand der Position ermitteln oder <= abfragen oder oder ...

    Denn in Deinem Beispiel 'müsste' der Name leer sein, wenn der Minimalwert in der ersten Zeile ist? Habe es nicht getestet aber so vom Bauchgefühl her.

    Gruss
    foodax

    Ja da hast du auch recht hab den Code umgeändert.

    String^ name;
    int min = Convert::ToInt16(listView1->Items[0]->SubItems[1]->Text);			 
    int anz= listView1->Items->Count;
    
    for(int x=0; x<anz; ++x)
    	{
    					if(Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text) < min)
    	{
    min = Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text);
    name = listView1->Items[x]->Text;
    	}
    
    						 if(Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text) == min)
    	{
    min = Convert::ToInt16(listView1->Items[x]->SubItems[1]->Text);
    name = listView1->Items[x]->Text;
    	}
    }
    

    Ich hoffe habe jetzt keine Fehler mehr drin. Und danke mal wieder 😃 .
    Wär das nicht auch eigentlich was für die FAQ? Du hast hier alles so schön erklärt mit Beispielen und ich habe so schöne Fragen (:D) gestellt.



  • Shashu schrieb:

    Ja da hast du auch recht hab den Code umgeändert.

    Ja, so meinte ich das zwar nicht, aber viele Wege führen nach Rom.

    Wär das nicht auch eigentlich was für die FAQ? Du hast hier alles so schön erklärt mit Beispielen und ich habe so schöne Fragen (:D) gestellt.

    Im Prinzip ist es ja nur ein Durchlaufen eines Arrays, also nichts besonderes.

    Ein komplettes Beispiel mit Spaltensortierung auf Doppelklick über die IComparer-Klasse wäre für eine FAQ vielleicht interessant.

    Gruss
    foodax



  • Ja da hast du recht das könnte noch interessanter sein. Aber sind es nicht oft auch diese Fragen die uns Anfänger quälen?


Anmelden zum Antworten