ListView SortOrder

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Pixxxas schrieb:

    Irgend was ist mit der ID, er kann dann nicht mehr Sortieren.
    Identisch das selbe Problem wie letztens.
    Du sortierst, während er die Sub-Items anhöngt.

    VB.NET-Quellcode

    1. Form1.LoadListview()

    intColumn = 5
    listviewY.SubItemCount = 1
    Das knallt halt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Argh, RfG war mal wieder schneller ||
    @Pixxxas: Nachdem ich Deine OleDB-Codes rausgehauen habe, die einige von uns nicht compilieren können und die ganzen VisualBasic-Namespace-Geschichten aktiv ausgeblendet habe, kam die Lösung schnell.
    Ergänzend zu dem Post von RfG: Vor dem ListViewItem-Neu-Hinzufügen erstmal den ListView1.ListViewSorter auf Nothing stellen. Nachdem alles drin ist, wieder Deinen ListViewSorter bei ListView1.ListViewSorter reinsetzen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Aber ich Sortiere doch erst nachdem er die Liste geladen hat? :/

    VB.NET-Quellcode

    1. Item.SubItems.Add(Oledr("ID").ToString())
    2. Item.ImageIndex = 1
    3. Loop
    4. Oledr.Close()
    5. cmpFileListViewComparer.SortOrder = SortOrder.Descending
    6. cmpFileListViewComparer.SortColumn = 9
    7. ListView1.Sort()
    Bilder
    • sdfsdf.png

      37,87 kB, 1.197×372, 61 mal angesehen
    Das interessiert aber den Comparer nicht, der fängt in der Zwischenzeit schon an zu werkeln, sonlage er mit dem ListView verbunden ist, sonst würde der Debugger auch gar keine Fehlermeldung in der ListViewComparer.Compare()-Funktion generieren. Und in der meckert ja der Compiler, richtig? Also bei mir zumindest schon. Wie gesagt, kurz ListView und Comprarer voneinander trennen und nach dem Hinzufügen der Items zur Liste wieder zusammenfügen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Meine Antwort aus Post 22 und 24 nochmal als Code:

    VB.NET-Quellcode

    1. Public Sub LoadListview()
    2. ListView1.ListViewItemSorter = Nothing 'NEU IM CODE
    3. ListView1.Items.Clear()
    4. Call Initialized()
    5. Oledr = OleDa.SelectCommand.ExecuteReader()
    6. Do While Oledr.Read()
    7. Item = ListView1.Items.Add(Oledr("Auftrag").ToString())
    8. Item.SubItems.Add(Oledr("Sachnummer").ToString())
    9. Item.SubItems.Add(Oledr("Bezeichnung").ToString())
    10. Item.SubItems.Add(Oledr("Stückzahl").ToString())
    11. Item.SubItems.Add(Oledr("Datum").ToString())
    12. Item.SubItems.Add(Oledr("ID").ToString())
    13. Loop
    14. Oledr.Close()
    15. cmpFileListViewComparer.SortOrder = SortOrder.Descending
    16. cmpFileListViewComparer.SortColumn = 5
    17. ListView1.ListViewItemSorter = cmpFileListViewComparer 'NEU IM CODE
    18. ListView1.Sort()
    19. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    So habe ich das ja gemacht, nur dann kommt der Fehler (Bild) bei dir ist es Column 5 bei mir 9

    Der Fehler kommt wenn ich das ausführe;

    VB.NET-Quellcode

    1. Try
    2. Call BuksanAngKoneksyon()
    3. OleDa.UpdateCommand = New OleDbCommand()
    4. OleDa.UpdateCommand.CommandText = "UPDATE [mechanik] SET [Start] = @Start , [Status] = @Status WHERE [Auftrag] = ?"
    5. OleDa.UpdateCommand.Connection = OleCn
    6. OleDa.UpdateCommand.Parameters.Add("@Start", OleDbType.VarWChar, 50, "Start").Value = CDate(System.DateTime.Now.ToString())
    7. OleDa.UpdateCommand.Parameters.Add("@Status", OleDbType.VarWChar, 50, "Status").Value = "50"
    8. OleDa.UpdateCommand.Parameters.Add(New System.Data.OleDb.OleDbParameter("Auftrag", System.Data.OleDb.OleDbType.VarWChar, 50,
    9. System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Auftrag",
    10. System.Data.DataRowVersion.Original, Nothing)).Value = ListView1.SelectedItems(0).Text
    11. OleDa.UpdateCommand.ExecuteNonQuery()
    12. Call LoadListview()
    13. Call IsaraAngKoneksyon()
    14. Label1.Text = "50"
    15. MsgBox("", MsgBoxStyle.Information, "")
    16. Catch ex As Exception
    17. MsgBox("", MsgBoxStyle.Exclamation, "")
    18. Call IsaraAngKoneksyon()
    19. End Try
    Bilder
    • Unbenannt.png

      52,01 kB, 1.247×480, 53 mal angesehen

    Pixxxas schrieb:

    wie stelle ich das am besten an?
    Das eine ist, das auatomatische Sortieren abzustellen, hat Dir @VaporiZed schon geschrieben, das andere ist, wie beim letzten Mal von mir empfohlen, die Items komplett zu erstellen und erst dann dem ListView hinzuzufügen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich frag gar nicht erst, ob Du einen der vorangegangenen Vorschläge versucht hast umzusetzen.

    Zu Deiner konkreten Frage, deren Antwort Du eigentlich sehr schnell selber hättest rausfinden sollen: Beim Start passiert folgendes (basierend auf dem von Dir zur Verfügung gestellten Testprojekt):
    1. Ein Comparer wird bei Form_Load erstellt, und zwar mit Default-Werten (SortColumn = 0, keine Sortierrichtung); Knackpunkt Nr. 1, deswegen kein Fehler zum Start; Gegenbeweis: stellst Du die SortColumn in ListViewComparer.New auf 1 oder so, crasht Dein Programm.
    2. Der Comparer wird dem ListView zugeordnet.
    3. Es werden ListView-Items erstellt. Der Comparer arbeitet schon im Hintergrund, produziert aber kein Fehler, da jedes neue Item bereits einen Wert in Spalte 0 hat und der Comparer somit vergleichen kann.
    4. Der Comparer wird auf eine Sortierreihenfolge eingestellt und (Knackpunkt 2, da jetzt der Grundstein für den Fehler gelegt wird): Die Sortierspalte wird auf 5 oder 9 oder was auch immer gestellt.
    Später, beim neu laden:
    1. Du löschst die ListView-Items.
    2. Der Comparer bleibt unverändert dem ListView zugeordnet und auch die Sortier-Spalte bleibt beim eingestellten Wert > 0. (s. oben, Punkt 4)
    3. Du fügst neue ListViewItems hinzu. Da Du erst den Wert für Spalte 0 dazupackst (ListView1.Items.Add("wasauchimmer")), dann Spalte 1 (per.SubItems.Add), dann Spalte 2 usw. (entgegen dem Hinweis von @RodFromGermany), findet Dein immer noch verbundener Comparer ein ListViewItem mit nur einer gefüllten Wertspalte vor. Wie gesagt, der Comparer ist dauerhaft aktiv, das heißt er reagiert (für Dich ungewollt) schon auf ListView1.Items.Add("was auch immer") und versucht zu vergleichen. Da er noch auf Spalte 5/9/wasauchimmer eingestellt ist, kommt Dein Fehler. Dass Du die Sortierung noch nicht willst, ist dem Comparer egal. Er reagiert bei allen Veränderungen an den Inhalten des zugeordneten ListViews.
    Daher nochmals die möglichen Fehlerbehebungswege:
    • Tipp von RfG: Ein eigenständiges ListViewItem komplett erstellen, dann erst dem ListView hinzufügen
    • ListViewItemSorter für ListView kurzzeitig auf Nothing stellen, ListViewItems wie bisher einfügen, Dein Comparer-Objektinstanz wieder dem ListViewItemSorter für ListView1 zuweisen
    • neu: einfach mal ne If-Abfrage in Deine Comparer-Klasse einbauen, die die Funktion mit Rückgabewert 0 vorzeitig abbricht, wenn die Spaltenanzahl eines der zu vergleichenden ListViewItems kleiner als die Zahl ist, die bei SortColumn eingestellt ist. Diese Bedingung hätte von Dir schon sehr viel früher eingebaut werden sollen, eben weil jegliche Klasse (in Deinem Fall die ListViewComparer-Klasse) nie davon ausgehen darf, dass das Programm, welches die Klasse benutzt, schon alles richtig machen wird
    • möglich, aber unschön, da das den bestehenden Fehler nur umgeht und nicht behebt: SortColumn erstmal vor dem Einfügen neuer Items auf 0 und später wieder auf 5/9/wasauchimmer stellen
    Ich wage mal zu behaupten, dass jede Klasse den worst-case der eigenen Benutzung voraussetzen muss, um Stabilität zu gewährleisten. Gezielte Vorbedingungen und sinnvolle Try-Blöcke sollten genutzt werden, um solche Fälle wie hier zu vermeiden und dem Benutzer einer Klasse gezielte Informationen zu geben.

    Ich befürchte, ich konnte nun alle noch vorhandenen Klarheiten beseitigen ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Pixxxas schrieb:

    wenn ich die Items neu lade
    In Post #10 hast Du es, glaubte ich, verstanden. In Post #27 hast Du alles vergessen. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!