Listview ordnet Einträge komisch

  • Hey Leute.

    Ich habe mich gerade mit Listview gespielt, und bin da auf ein Blödes Problem gestossen:

    Wenn ich jetzt zum Beispiel 21 Einträge habe, die alle "Ebene ZAHL" heißen, sieht es so aus:

    Spoiler anzeigen

    Ebene 1
    Ebene 10
    Ebene 11
    Ebene 12
    Ebene 13
    Ebene 14
    Ebene 15
    Ebene 16
    Ebene 17
    Ebene 18
    Ebene 19
    Ebene 2
    Ebene 20
    Ebene 21
    Ebene 3
    Ebene 4
    Ebene 5
    Ebene 6
    Ebene 7
    Ebene 8
    Ebene 9

    Der String, den ich mit GUICtrlSetData($List1,$list) übergebe, schaut so aus: Ebene 1|Ebene 2| .... also geordnet.

    Wie löse ich das Problem am besten?

    Ach ja, für die, die es nicht verstehen:

    Spoiler anzeigen
    [autoit]

    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=

    [/autoit] [autoit][/autoit] [autoit]

    $list = "Ebene 1"
    $ebenen = 1

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 633, 360, 192, 124)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    $List1 = GUICtrlCreateList("", 8, 16, 97, 292,BitOR($LBS_SORT,$LBS_DISABLENOSCROLL,$WS_BORDER))
    GUICtrlSetData(-1, $list)
    $Radio1 = GUICtrlCreateRadio("", 32, 312, 17, 17)
    GUICtrlSetOnEvent(-1,"_add")
    $Radio2 = GUICtrlCreateRadio("", 56, 312, 17, 17)
    GUICtrlSetOnEvent($Radio2,"_del")
    $Pic1 = GUICtrlCreatePic("", 112, 16, 500, 300, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _add()
    GUICtrlSetData($List1, "")
    $ebenen += 1
    $list = "Ebene " & $ebenen & "|" & $list
    GUICtrlSetData($List1, $list)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _del()
    GUICtrlSetData($List1, "")
    if($ebenen < 10) Then
    $list = StringTrimLeft($list,8)
    Else
    $list = StringTrimLeft($list,9)
    EndIf
    $ebenen -= 1
    GUICtrlSetData($List1, $list)
    EndFunc

    [/autoit]

    Klickt auf den ersten Radiobutton, fügt er eine Ebene hinzu. Beim zweiten löscht er wieder eine.

    • Offizieller Beitrag

    Die Sortierung ist aber normal. Ebene10 kommt in der Sortierung nun mal vor Ebene2.
    Gggf. solltest du die Sortierung weglassen.

  • Ja, aber 10 ist größer als 1 und 2. Kann ich das nicht iergendwie machen, dass er es "normal" ordnet. Also von den Zahlen ausgegangen?

    • Offizieller Beitrag

    Dadurch, dass du Strings und Ziffern in einem Item hast, wird dieses auch als String interpretiert und somit völlig korrekt sortiert.
    Wenn du eine numerische Sortierung der angehängten Ziffern willst, mußt du statt "1" - "01" usw. verwenden. :)

  • Ja, aber bei der Ebene 101 schaut es ja dann wie in Binär aus:

    "Ebene 0101|Ebene 0100|...."

    Nein, jetzt ohne spaß, kann er die Listeinträge nicht so übernehmen, wie es im String steht?

    • Offizieller Beitrag

    Nein, jetzt ohne spaß, kann er die Listeinträge nicht so übernehmen, wie es im String steht?


    Du kapierst es nicht. Die Einträge werden doch exakt so übernommen. Das sind STRINGS!!! Die lassen sich nicht nach numerischen Bestandteilen sortieren. (Außer mit meiner aufgezeigten Variante)

  • Ich weiß, dass es strings sind, nur verstehe ich nicht, warum er sie Ordnet. Gibt es keine Möglichkeit, dass er die Strings einfach von $list übernimmt? ALso ohne das er daran pfuscht?

  • Ja, aber bei der Ebene 101 schaut es ja dann wie in Binär aus:

    "Ebene 0101|Ebene 0100|...."

    Nein, jetzt ohne spaß, kann er die Listeinträge nicht so übernehmen, wie es im String steht?


    Na ja, anstatt links mit 0 aufzufüllen, kannst du auch mit Leerzeichen auffüllen falls dir das besser gefällt:

    Spoiler anzeigen
    [autoit]

    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=

    [/autoit] [autoit][/autoit] [autoit]

    $list = "Ebene 1"
    $ebenen = 1

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 633, 360, 192, 124)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    $List1 = GUICtrlCreateList("", 8, 16, 97, 292,BitOR($LBS_SORT,$LBS_DISABLENOSCROLL,$WS_BORDER))
    GUICtrlSetData(-1, $list)
    $Radio1 = GUICtrlCreateRadio("", 32, 312, 17, 17)
    GUICtrlSetOnEvent(-1,"_add")
    $Radio2 = GUICtrlCreateRadio("", 56, 312, 17, 17)
    GUICtrlSetOnEvent($Radio2,"_del")
    $Pic1 = GUICtrlCreatePic("", 112, 16, 500, 300, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _add()
    GUICtrlSetData($List1, "")
    $ebenen += 1
    $list = "Ebene " & StringRight(" " & $ebenen,3) & "|" & $list
    GUICtrlSetData($List1, $list)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _del()
    GUICtrlSetData($List1, "")
    $list = StringTrimLeft($list,10)
    $ebenen -= 1
    GUICtrlSetData($List1, $list)
    EndFunc

    [/autoit]

    frohe weihnachten autoBert