ListView Sortierungshäkchen entfernen

  • Hallo Zusammen,

    ich habe für unsere IT ein Inventarisierungstool in AutoIT geschrieben, welches die Daten direkt in eine MSSQL Datenbank schreibt/Liest. Das Tool besitzt 3 Tabs - Suchen (um auf der Datenbank nach Datensätzen zu suchen und diese ggf abzuändern), Hardware intern (um neue Datensätze hinzuzufügen) und Telearbeit (um neue Datensätze hinzuzufügen). Soviel zu der grundlegenden Funktion.

    Der Suchen Tab sieht wie folgt aus:

    Das Problem ist das Sortierhäkchen bei Model

    ich habe mit

    _GUICtrlListView_RegisterSortCallBack($ListView1)

    die ListView sortierbar gemacht, was auch gut funktioniert. Wechsel ich allerdings in einen anderen Tab (HARDWARE INTERN oder TELEARBEIT) und wieder zurück auf SUCHEN wird die liste neu befüllt (da ich ja evtl neue Sätze hinzugefügt habe und diese auch angezeigt haben möchte.). Die Liste wird dann automatisch wieder nach der ID absteigend sortiert. Das Sortierhäkchen bleibt aber bei model(oder einem anderen wert nach dem ich sortiert habe) bestehen.

    Das ist zwar kein Problem, sieht aber unschön aus. Die Frage ist also - Hat einer eine Idee, wie ich dieses Sortierhäkchen entfernen kann?

    Ich hoffe ich konnte mein Problem gut erläutern :D

    Vielen Dank schon mal

    ~smaster

  • Hallo smaster123
    Ich weiß nicht, wie man den Haken wieder entfernt. Bis dir da jemand hilft, könntest du einfach mit _GUICtrlListView_SortItems die ID Spalte markieren. Dann sieht es wenigstens stimmig aus.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (6. August 2019 um 10:04)

  • Hey autoiter

    das ist schon einmal eine gute Idee, leider sortiert es dann eben noch einmal. Dadurch wirkt das Tool sehr träge -> Ich holde die Daten von der Datenbank direkt absteigend sortiert. Durch GUICtrlListView_SortItems($idListView, -1) wird es dann wieder aufsteigend sortiert. Nun könnte ich die Daten zwar auch aufsteigend sortiert von der DB holen und dann durch GUICtrlListView_SortItems($idListView, -1) wieder absteigend sortieren das wäre eine Möglichkeit, nur leider stehen die Daten dann erst einmal unsortiert 1-2Sek im ListView bevor sie umsortiert werden (der Befehl ist wohl nicht so schnell bei ~500 einträgen (am ende werden es noch mehr einträge).

    lg

  • Deine Suche ist aber ein langes Konstrukt. Das könnte man vllt. etwas kürzer machen, wenn du mit Arrays, Schleifen und evtl. Enum arbeitest.
    Warum du _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate da brauchst, damit die Beschriftung nicht verschwindet weiß ich auch nicht.
    Allerdings solltest du es (wenn Zeit schon eine Rolle spielt so einsetzen, dass es dir auch Vorteile bringt. Bei größeren Manipulationen an der Listview solltest du das Bildschirmupdate der Listview als erstes abschalten mit _GUICtrlListView_BeginUpdate, dann deine Arbeit erledigen und danach mit _GUICtrlListView_EndUpdate das fertige Ergebnis anzeigen lassen. Das beschleunigt den Prozess enorm (bei _GUICtrlListView_AddArray ist das nicht notwendig). Das _GUICtrlListView_SortItems wird dann auch deutlich schneller sein.

    Allerdings findet sich bestimmt noch jemand, der eine sauberere Lösung weiß, als solch einen Workaround.

    Grüße autoiter

    • Offizieller Beitrag

    Den Workaround braucht man nicht!

    Man holt sich das Handle vom Listview-Header und benutzt dann die Headerbefehle.

    Aber das sortieren im Listview ist sehr langsam, vor allem, wenn es viele Einträge gibt.

    Viel schneller geht das, wenn man die Daten in einem Array speichert und dieses sortiert. Also: Listview komplett löschen, Array sortieren und das Listview wieder mit dem sortierten Array befüllen.

    Ich habe dazu mal ein Beispielscript geschrieben:

  • Hallo smaster123

    Das wäre mein Vorschlag für dein Skript, wenn du es auch noch etwas kürzer haben wolltest..

    Wenn dir das zu viel Aufwand ist, genügt es auch, wenn du unterste Schleife in deinen Code einbaust. Mit _GUICtrlHeader_SetItemFormat kann man den Pfeil entfernen. Das _GUICtrlListView_SortItems braucht es dann gar nicht mehr. Dennoch würde ich weiter beachten _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate zu verwenden.

    Grüße autoiter

    2 Mal editiert, zuletzt von autoiter (7. August 2019 um 14:57) aus folgendem Grund: C&P Fehler im Code..

  • Hallo autoiter und Oscar ,

    das sortieren ist bei mir doch gar nicht notwendig, ich hole die Daten schon sortiert von der Datenbank:

    If GUICtrlRead($Radio1) = 1 Then $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where typ like '%" & $suche & "%' Order by ID desc")

    das Order by ID desc bedeutet, dass es nach ID absteigend sortiert abgeholt wird. Deshalb hatte ich anfangs gar kein sortieren drin.

    Leider hilft keiner von euren Vorschlägen bei dem eigentlichen Problem :P

    Zitat von @autoiter

    Warum du _GUICtrlListView_BeginUpdate und _GUICtrlListView_EndUpdate da brauchst, damit die Beschriftung nicht verschwindet weiß ich auch nicht.

    Das war ein seltsames verhalten. Ich habe GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")  eingebaut, wodurch ich die ListView klickbar gemacht habe und die Daten auch änderbar gemacht habe. Habe ich einen Wert gedoppelklickt, den Wert angepasst und bestätigt wurde eine erneute Suche ausgeführt. Daraufhin sind die Header der Listview unsichtbar geworden (warum auch immer). Sichtbar wurden sie wieder, wenn man mit der Maus darüber gefahren ist. Das Update hat dem abholfe geschaffen. Ich habe sie aber nun wie von dir empfohlen platziert und das funktioniert auch.

    lg

    • Offizieller Beitrag

    das sortieren ist bei mir doch gar nicht notwendig, ich hole die Daten schon sortiert von der Datenbank:

    ich habe mit

    _GUICtrlListView_RegisterSortCallBack($ListView1)

    die ListView sortierbar gemacht, was auch gut funktioniert

    Du widersprichst Dir selbst!

    Was willst Du denn nun erreichen?

    Soll das Listview sortiert werden können oder nicht?

    Außerdem habe ich Dir die Lösung für den Sortierpfeil bereits geschrieben (_GUICtrlHeader_SetItemFlags). Dafür brauchst Du das Handle vom Listview-Header.

    Ich könnte Dir das auch in Dein Script integrieren, wenn Du es mal posten würdest (u.U. mit Zufallsdaten, wie ich das gemacht habe).

  • Hallo ihr zwei,

    autoiter Dein vorschlag hat geholfen und war genau das was ich gesucht habe, Danke!

    Oscar Ich hole die Daten Sortiert von der Datenbank, Richtig. Dadurch sind sie nach der eindeutigen ID sortiert und man sieht immer zuerst das neuste. Trotzdem habe ich _GUICtrlListView_RegisterSortCallBack($ListView1) eingebaut, damit man die Daten über einen Klick im Header bei bedarf nach etwas anderem sortieren kann. Das Problem war ja eben nur, dass das Sortierhäkchen bei einem erneuten befüllen des ListView nicht verschwunden ist, was ich nun mit tt]_GUICtrlListView_RegisterSortCallBack($ListView1)[/tt] beheben konnte. Auch dir danke für die hilfe.

    lg

  • Hallo autoiter,

    ich habe nun verscuht dein vorschlag mit den Radios einzubauen. leider klappt die SQL abfrage nicht wie gewünscht und ehrlich gesagt verstehe ich $g_aRadio[_ArraySearch($g_aRadio, 5)][1] nicht so ganz :D...

    ich bekomme folgende Meldung:

    "...blabla...\Inventar.au3" (784) : ==> Variable subscript badly formatted.:

    $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where " & $g_aRadio[_ArraySearch($g_aRadio, 5)][1] & " like '%" & $suche & "%' Order by ID desc")

    $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where " & $g_aRadio[^ ERROR

    lg

  • Ach, warum probierst du denn meinen Code auch wirklich aus?!? 8o

    Ich hatte das aus einem anderen Testcode von mir rauskopiert und mir ist erst später aufgefallen, dass hier die Bedingung nicht gegeben ist für diesen Aufruf. Dann habe ich versucht es heimlich zu korrigieren. Aber du hast es nun ans Tageslicht gebracht ^^

    Schau dir meinen letzten Beitrag nochmal an. Der Code ist bei diesem Aufruf ein anderer, als zum Zeitpunkt, als du das kopiert hast. Sorry dafür.

    Grüße autoiter

  • hahahahaha ja okay :D

    aber ich denke das ist auch noch nicht korrekt :O

    1. SQLOPEN()
    2. $getrecord = _MSSQL_GetRecord($sqlCon, "TabelleA", "*", "where " & $g_aRadio[$g_aRadio, $iIndex][1] & " like '%" & $suche & "%' Order by ID desc")
    3. ; If @error Then ..
    4. SQLCLOSE()

    da muss noch die variable raus :). So funktioniert es nun. Danke!!