Mehrere Items in mehrspaltige ListView eintragen?

  • Hallo Leute!

    Suche eine Möglichkeit kopierte Items im Format "Pos|1|2|3|4|5" in eine mehrspaltige Listview einzutragen.

    [autoit]


    GUICtrlCreateListViewItem ()

    [/autoit]


    funktioniert nicht da es erstens nur ans ende der liste hinzufügt und immer nur eine Zeile

    [autoit]


    _GUICtrlListView_InsertItem ()

    [/autoit]


    fügt zwar mehrere Items im Format wie oben ein jedoch nicht in eine mehrspaltige.

    [autoit]


    GUICtrlSetData

    [/autoit]


    gibt auch mehrere Items aus jedoch nicht direkt in die zeile einer ListView.
    So langsam fällt mir sonst keine Funktion ein mit der dies zu bewerkstelligen wäre. Vielleicht könnt Ihr mir dabei helfen, dies zu erreichen... :whistling:

    Spoiler anzeigen
    Zitat

    Ich weiß wo dein Haus wohnt... 8o

  • Dann bastel dir doch eine Func. Hier mal das Grundgerüst.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #Include <GuiListView.au3>

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

    $Gui = GUICreate("Gui", 400, 200)
    $hListView = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3|Spalte4", 5, 5, 350, 180)
    GUICtrlCreateListViewItem("1|2|3|4", $hListView)
    GUICtrlCreateListViewItem("A|B|C|D", $hListView)
    GUICtrlCreateListViewItem("1A|2B|3C|4D", $hListView)
    _GUICtrlListView_InsertRow($hListView, "Test1|Test2|Test3|Test4", 1)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _GUICtrlListView_InsertRow($hWnd, $sText, $iIndex)
    $aSplit = StringSplit($sText, "|")
    _GUICtrlListView_InsertItem($hWnd, $aSplit[1], $iIndex)
    For $i = 1 To $aSplit[0] - 1
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aSplit[$i + 1], $i)
    Next
    EndFunc

    [/autoit]
  • Der Ansatz ist gut, jedoch funktioniert die func auch nicht in einer mehrspaltigen listview, habe die func mal 1:1 übertragen und beim Versuch die items zu kopieren und
    wieder einzufügen, übernimmt er zwar die Formatierung mit den Tab Abständen in Excel,Editor, Word etc. jedoch nicht in meiner ListView.

    Hier mal ein Screenshot: [Blockierte Grafik: http://www.autoit.de/index.php?page=Attachment&amp;attachmentID=8427&amp;h=91c38911551ad9ad04649242997321731d592a20]

    Die Func zum einfügen:

    [autoit]


    Opt("GUIDataSeparatorChar", @TAB)
    $pasteindex = _GUICtrlListView_GetSelectedIndices($Liste, False)
    _GUiCtrlListView_INsertRow ($Liste, Clipget(),$pasteindex)
    Sleep(150)
    Opt("GUIDataSeparatorChar", Default)
    EndFunc ;==>strg_v

    [/autoit]

    bitte helft mir...
    THX @m-obi

  • Probier mal bitte diese Funktion:

    Spoiler anzeigen
    [autoit]

    Func _GUICtrlListView_InsertRow($hWnd, $sText, $iIndex)
    ;m-obi, edit by SEuBo
    $aItem = StringSplit($sText, @CRLF, 3)
    For $i = 0 To UBound($aItem) - 1
    $aSub = StringSplit($aItem[$i], @TAB, 3)
    If Not @error Then
    _GUICtrlListView_InsertItem($hWnd, $aSplit[0], $iIndex)
    For $j = 1 To UBound($aSub) - 1
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aSplit[$i], $i)
    Next
    EndIf
    Next
    EndFunc ;==>_GUICtrlListView_InsertRow

    [/autoit]
  • Sorry mein Fehler, hatte nich nochmal drüber geguckt.
    So sollte es aber klappen (hoffe ich)

    Spoiler anzeigen
    [autoit]

    Func _GUICtrlListView_InsertRow($hWnd, $sText, $iIndex)
    $aItem = StringSplit($sText, @CRLF, 3)
    For $i = 0 To UBound($aItem) - 1
    $aSub = StringSplit($aItem[$i], @TAB, 3)
    If Not @error Then
    _GUICtrlListView_InsertItem($hWnd, $aSub[0], $iIndex)
    For $j = 1 To UBound($aSub) - 1
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aSub[$i], $i)
    Next
    EndIf
    Next
    EndFunc ;==>_GUICtrlListView_InsertRow

    [/autoit]
  • knifflige Aufgabe. Hierbei kopiert er nur bei einem Item den 1. Wert mit und einmal keinen....

    [Blockierte Grafik: http://www.autoit.de/index.php?page=Attachment&amp;attachmentID=8432&amp;h=057ad6ca96530aa43fb0e889a938b269ec24a24b]


    @dpjeezy89
    Nicht ganz da dabei im gewählten Index eingefügt wird... was der Bedienbarkeit und Übersichtlichkeit zugute kommt.

  • Soo Versuch #215235235

    Spoiler anzeigen
    [autoit]

    Func _GUICtrlListView_InsertRow($hWnd, $sText, $iIndex)
    $aItem = StringSplit($sText, @CRLF, 3)
    For $i = 0 To UBound($aItem) - 1
    $aSub = StringSplit($aItem[$i], @TAB, 3)
    If Not @error Then
    _GUICtrlListView_InsertItem($hWnd, $aSub[0], $iIndex)
    For $j = 0 To UBound($aSub) - 1
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aSub[$j], $j+1)
    Next
    EndIf
    Next
    EndFunc ;==>_GUICtrlListView_InsertRow

    [/autoit]

    Hab mir jetzt auch extra ein Beispiel dazu gebastelt :D

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    $hGUI = GUICreate("")
    $hListview = _GUICtrlListView_Create($hGUI, "", 20, 20, 360, 360)
    _Example($hListview)

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

    _GUICtrlListView_InsertRow($hListview, "Test Neu 2_1" & @TAB & "Test Neu 2_2" & @TAB & "Test Neu 2_3" & @CRLF & "Test Neu 3_1" & @TAB & "Test Neu 3_2" & @TAB & "Test Neu 3_3", 1)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func _GUICtrlListView_InsertRow($hWnd, $sText, $iIndex)
    $aItem = StringSplit($sText, @CRLF, 3)
    For $i = 0 To UBound($aItem) - 1
    $aSub = StringSplit($aItem[$i], @TAB, 3)
    If Not @error Then
    _GUICtrlListView_InsertItem($hWnd, $aSub[0], $iIndex)
    For $j = 0 To UBound($aSub) - 1
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aSub[$j], $j+1)
    Next
    EndIf
    Next
    EndFunc ;==>_GUICtrlListView_InsertRow

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

    Func _Example($hListview)
    Local $aTestItems[3][3] = [["Test 1_1", "Test 1_2", "Test 1_3"],["Test 2_1", "Test 2_2", "Test 2_3"],["Test 3_1", "Test 3_2", "Test 3_3"]]
    _GUICtrlListView_AddColumn($hListview, "Col 1")
    _GUICtrlListView_AddColumn($hListview, "Col 2")
    _GUICtrlListView_AddColumn($hListview, "Col 3")

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

    _GUICtrlListView_SetColumnWidth($hListview, 0, 120)
    _GUICtrlListView_SetColumnWidth($hListview, 1, 120)
    _GUICtrlListView_SetColumnWidth($hListview, 2, 120)
    _GUICtrlListView_AddArray($hListview, $aTestItems)
    EndFunc ;==>_Example

    [/autoit]
  • :thumbup:  SEuBo
    Du bist ein Genie!
    Als einziges Manko sehe ich, das die eingefügten Items nun in verkehrter Reihenfolge eingetragen werden(d.h. kopiert man Pos A. & Pos C. dann wird nicht A|C eingetragen sondern C|A)


    [Blockierte Grafik: http://www.autoit.de/index.php?page=Attachment&amp;attachmentID=8433&amp;h=44268cc964ae5c9f90dd1ba5beefb433f7a795c9]

  • So rum besser?

    Spoiler anzeigen
    [autoit]

    Func _GUICtrlListView_InsertRow($hWnd, $sText, $iIndex)
    $aItem = StringSplit($sText, @CRLF, 3)
    For $i = UBound($aItem) - 1 To 0 Step -1
    $aSub = StringSplit($aItem[$i], @TAB, 3)
    If Not @error Then
    _GUICtrlListView_InsertItem($hWnd, $aSub[0], $iIndex)
    For $j = 0 To UBound($aSub) - 1
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aSub[$j], $j+1)
    Next
    EndIf
    Next
    EndFunc ;==>_GUICtrlListView_InsertRow

    [/autoit]
  • Perfekt! :thumbup::thumbup::thumbup:

    Vielleicht kannst dur mir die "for" schleifen erklären damit auch ich noob das verstehe?

    Ich danke dir 1000x...
    Ich wäre dafür das diese func in die Listview UDF aufgenommen wird! (ganz klar)
    da dies eine enorme Erleichterung darstellt mir Listview Elementen zu arbeiten, und eine vergleichbare Funktion nicht existiert (bis jetzt
    !)

    Spoiler anzeigen
    Zitat

    Ich weiß wo dein Haus wohnt... 8o

    Einmal editiert, zuletzt von stinger2k (27. März 2010 um 13:02)

  • Also bei mir funktioniert sie in einem ListView. Ich hatte auch gedacht das Pos von "Pos|1|2|3|4|5" der Index wäre, also an welcher Stelle es eingefügt werden sollte. Das wäre für mich die Position.

  • @m-obi
    Das passt auch so wie in der Func oben, nur eben das ich es an der stelle einfügen will wo ich die markierung setze...

    Ohne deinen Ansatz wären sicher noch etliche Versuche nötig gewesen, danke auch dir dafür.. :thumbup:

    Spoiler anzeigen
    Zitat

    Ich weiß wo dein Haus wohnt... 8o

  • Wie gesagt ich hatte das anders verstanden in deinem Eröffnungspost. Aber nun funktioniert es ja oder?

  • Eine For-Next Schleife. Diese Schleife wird, verwendet um eine Aufgabe bestimmt oft zu wieder holen (zb: 1 to 10 = 1 bis 10). Die definierte Variable ist die sog. Laufvariable, die immer den aktuellen "Zähler" angibt. Optional ist bei einer For-Next schleife der Step Parameter, mit dem die Schrittweite angegeben werden

    Spoiler anzeigen
    [autoit]

    ;1 - 10. In 1er Schritten
    MsgBox(64, "", "1 - 10. In 1er Schritten")
    For $i = 1 To 10
    MsgBox(0, "For $i = 1 To 10", $i)
    Next

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

    ; Oder in 2er Schritte
    MsgBox(64, "", "1 - 10. In 2er Schritten")
    For $i = 1 To 10 Step 2
    MsgBox(0, "For $i = 1 To 10 Step 2", $i)
    Next

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

    ; Das ganze geht auch rückwärts: (Dafür muss Step aber negativ sein!!)
    MsgBox(64, "", "Das ganze geht auch rückwärts: (Dafür muss Step aber negativ sein!!)")
    For $i = 10 To 1 Step -1
    MsgBox(0, "For $i = 10 To 1 Step -1", $i)
    Next

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

    MsgBox(64, "", "For-Next schleifen werden Oft benutzt, um Arrays durchzugehen")
    Dim $aArray[5] = [ _
    "Wert 1", _
    "Wert 2", _
    "Wert 3", _
    "Wert 4", _
    "Wert 5" _
    ]

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

    For $i = 0 To UBound($aArray)-1 ; Ubound gibt die Größe eines Arrays zurück. (Hier 5)
    ;Da der Array aber nur von $aArray[0] bis $aArrray[4] geht (arrays sind 0 basiert), machen wir nicht
    ;For $i = 1 to Ubound($aArray), sondern For $i = 0 to Ubound($aArray)-1
    MsgBox(0
    ,"$aArray["&$i&"]",$aArray[$i])
    Next

    [/autoit]
  • Hallo stinger2k,

    habe die func etwas angepasst, damit man das Trennzeichen freiwählen kann.:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiListView.au3>
    #include <array.au3>

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

    GUICreate("Sample List View", 230, 300, -1, -1);, $WS_OVERLAPPEDWINDOW)
    $idLV = GUICtrlCreateListView("Sample|ListView", 10, 10, 180, 180);, -1, $LVS_EX_HEADERDRAGDROP)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE) ; legt fest, dass Hintergrundfarbe wechselt
    GUICtrlSetBkColor(-1, 0xE6E6FA) ; Hintergrundfarbe 1
    GUICtrlCreateListViewItem("A|One", $idLV)
    GUICtrlSetBkColor(-1, 0xcccccc) ; Hintergrundfarbe 2
    GUICtrlCreateListViewItem("B|Two", $idLV)
    GUICtrlSetBkColor(-1, 0xcccccc) ; Hintergrundfarbe 2
    GUICtrlCreateListViewItem("C|Three", $idLV)
    GUICtrlSetBkColor(-1, 0xcccccc) ; Hintergrundfarbe 2
    $idbtnNeu = GUICtrlCreateButton("&Neues Item", 10, 200)

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

    GUISetState()
    $i = GUICtrlRead($idLV)
    ConsoleWrite($i & @CRLF)
    _GUICtrlListView_SetColumnWidth($idLV, "xy|ngelöst", $i)
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idbtnNeu
    $i = _GUICtrlListView_GetSelectedIndices($idLV,False)
    ConsoleWrite($i & @CRLF)
    _GUICtrlListView_InsertRow($idLV, "Test|456", $i,"|")
    EndSwitch
    WEnd

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

    Func _GUICtrlListView_InsertRow($hWnd, $sText, $iIndex,$sDelim)
    $aItem = StringSplit($sText, @CRLF, 3)
    For $i = 0 To UBound($aItem) - 1
    $aSub = StringSplit($aItem[$i], $sDelim, 3)
    If Not @error Then
    _GUICtrlListView_InsertItem($hWnd, $aSub[0], $iIndex)
    For $j = 1 To UBound($aSub) - 1
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aSub[$j], $j)
    Next
    EndIf
    Next
    EndFunc ;==>_GUICtrlListView_InsertRow

    [/autoit]

    mfg (Auto)Bert