bestimmten Eintrag im ListView editieren (über Context-Menü)

  • Servus ;)

    ich hab mal wieder ne kleine Frage...

    So und zwar habe ich ein ListView in welches variable Einträge geschrieben werden. zu jedem neuen Eintrag wird ein context-menü erzeugt - bis hierher funktioniert alles bestens. jetzt habe ich einen eintrag im context-menü "bearbeiten", über welchen ich genau DEN eintrag editieren will, über dem ich das contextmenü geöffnet habe... dazu brauche ich wert des eintrages an dieser stelle! wie kann ich jetzt aus einem listview diesen wert auslesen... die komplette zeile wäre nicht das problem und hab ich auch schon verwendet zum löschen... aber ich will ja nicht alles editieren, sondern nur den eintrag in einer bestimmten spalte über welche das contextmenü geöffnet wurde...

    na verstanden? ... code posten bringt nix, da ihr den sooderso nicht ausführen könnt (is ne datenbank im hintergrund usw...)

    schonmal danke

    ps: noch ne kleine info, es wird für jeden eintrag dann quasi ein neues edit-gui aufgerufen in dem der eintrag editiert werden kann...

    Einmal editiert, zuletzt von oliverh (18. Januar 2008 um 10:41)

  • ListView wird "altmodisch" über

    [autoit]

    GUICtrlCreateListView(...)

    [/autoit]

    erstellt. Wie bekomme ich den Spaltenindex?!?!? Zeilenindex is mir klar...

    • Offizieller Beitrag

    Achso, du möchtest ein Subitem per Klick auswählen und bearbeiten - das ist meines Wissens nicht möglich.
    Du kannst dir nur den Index (oder auch Text) eines gesamten Items (inkl. Subitems) zurückgeben lassen. z.B. Auslösen mit re. Maustaste.
    Für das Subitem selber mußt du den Spaltenindex selber angeben.

    [autoit]

    $msg = GUIGetMsg()
    Case $msg = $GUI_EVENT_SECONDARYUP
    $indxRow = _GUICtrlListView_GetSelectedIndices($hListView, True)
    $SpaltenText = _GUICtrlListView_GetItemText($hListView, $indxRow[1], 'SpaltenIndex') ; 'SpaltenIndex' mußt du vorgeben

    [/autoit]
  • Das Item/SeubItem unter MousePos kann auch mit
    _GUICtrlListView_SubItemHitTest($ListView)
    ermittelt werden. ($X = -1, $Y = -1, dann wird die MousePos verwendet.=)

  • ich weiß das es mit angeben des jeweiligen spaltenindex funktioniert...

    aber ich will das ja automatisch machen ;) wusste gleich das der sch... nicht einfach werden würde...


    sonst noch jemand ne idee?

  • Warum nicht einfach eine GUI, in der man alle Spalten bearbeiten kann?
    Dann muss nur die Zeile abgefragt werden, und in der GUI kann man alles bearbeiten.

  • Das Item/SeubItem unter MousePos kann auch mit
    _GUICtrlListView_SubItemHitTest($ListView)
    ermittelt werden. ($X = -1, $Y = -1, dann wird die MousePos verwendet.=)


    _GUICtrlListView_SubItemHitTest(...)

    -> Kannst du mir die vielleicht kurz die Funktion aus der UDF sowie beschreibung usw posten, da ich noch nicht die neuste version von autoIT installiert hab... wär nett danke!

    (und nein ich installier die neue version nicht, da sonst mein ganzes script nich mehr funktioniert ;) )

  • is leider schon zu spät ;) das projekt is n bissl zu groß um nochmal alles "neu" anzufangen... is für die schule und muss irgendwann nächste woche fertig sein...

  • //Edit: was für ein Projekt denn? *Neugierig*
    warum?
    Hast du etwa schon eine Bearbeitungsmaske? Dann nimm halt die statt der GUI

    [autoit]

    $Edit = GUctrlCreateContextmenuitem("BEarbeiten")
    ...
    Case $msg = $Edit
    $EditGUI = GUICreate("Edit")
    ...
    While 1

    WEND
    Guisetdata...
    GUIDelete($EditGUI)
    Csae $msg = ...

    [/autoit]
    • Offizieller Beitrag

    Ich hab mal aus der Hilfedatei ein kleines Bsp. gebastelt mit Rechtsklick zum Ändern des Sub-Items.
    Für alle, die es mal brauchen können.
    Die Zeile: $hWnd = ControlGetHandle('','',$hListView) läßt sich nicht umgehen. Für die neuen Funktionen wird fast immer das Handle benötigt.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>

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

    GUICreate("(Internal) ListView Get Column", 400, 300)
    $hListView = GUICtrlCreateListView("col1|col2|col3", 2, 2, 394, 268)
    _GUICtrlListView_SetExtendedListViewStyle ($hListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
    _GUICtrlListView_SetColumnWidth($hListView, 0, 100)
    GUISetState()

    GUICtrlCreateListViewItem("index 0|data1|more1", $hListView)
    GUICtrlCreateListViewItem("index 1|data2|more2", $hListView)
    GUICtrlCreateListViewItem("index 2|data3|more3", $hListView)
    GUICtrlCreateListViewItem("index 3|data4|more4", $hListView)
    GUICtrlCreateListViewItem("index 4|data5|more5", $hListView)

    Do
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_SECONDARYUP
    $hWnd = ControlGetHandle('','',$hListView)
    $indx = _GUICtrlListView_SubItemHitTest($hWnd)
    $newText = InputBox('Wert ändern', 'Zeile: ' & $indx[0]+1 & '/Spalte: ' & $indx[1]+1, _GUICtrlListView_GetItemText($hWnd, $indx[0], $indx[1]))
    If $newText <> '' Then _GUICtrlListView_SetItemText($hWnd, $indx[0], $newText, $indx[1])
    EndSwitch
    Until $msg = $GUI_EVENT_CLOSE
    GUIDelete()

    [/autoit]
  • hey ;) dankeschön für eure hilfe... jetzt bräuchte ich noch kurz die funktion

    [autoit]

    _GUICtrlListView_SubItemHitTest($ListView)

    [/autoit]

    aus der UDF... wie gesagt hab die neue vers nich installiert und muss die funktion deßhalb direkt mit einbinden...


    aber vielen dank schonmal für eure hilfe!


    achja, @progandy das projekt ist eine filmdatenbank mit GUI für die schule...

  • dann gib mir doch auch bitte die *g*

    will ned die neue version installieren, hatte als ich das daletzt gemacht hab so dermaßen viele probleme beim rollback das ich das nich mehr unbedingt habe will :)


    EDIIIIIIIIIIT: am besten vielleicht wirklich mal die funktion einfach posten, werd dann schon selber rausfinden was ich noch dazu brauch.... also winapi.au3 hab ich jetzt ;)

  • Machs doch einfach so:
    Sonst gibt das so ein Flickwerk... Funktion aus v3.2.8.1 ... aus v3.2.10.0 ...

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>

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

    GUICreate("(Internal) ListView Get Column", 400, 300)
    $columns = "col1|col2|col3"
    $hListView = GUICtrlCreateListView($columns, 2, 2, 394, 268)
    GUISetState()

    GUICtrlCreateListViewItem("index 0|data1|more1", $hListView)
    GUICtrlCreateListViewItem("index 1|data2|more2", $hListView)
    GUICtrlCreateListViewItem("index 2|data3|more3", $hListView)
    GUICtrlCreateListViewItem("index 3|data4|more4", $hListView)
    GUICtrlCreateListViewItem("index 4|data5|more5", $hListView)
    Do
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_SECONDARYUP
    $index = _GUICtrlListViewGetHotItem($hListView)
    $Items = _GUICtrlListViewGetItemTextArray($hListView,$index)
    $GUI = Guicreate("hi",300,$Items[0]*40+50)
    $Start = GuiCtrlCreateDummy()
    For $i = 1 To $Items[0]
    GuiCtrlcreateInput($Items[$i],90,($i-1)*40+10,200,20)
    Next
    $End = GuiCtrlCreateDummy()
    $LVHeader = StringSplit($columns,"|")
    For $i = 1 To $LVHeader[0]
    GuiCtrlcreateLabel($LVHeader[$i],10,($i-1)*40+10,80,20)
    Next
    $save = GUICtrlcreateButton("Speichern",50,$Items[0]*40,60)
    $cancel = GUICtrlcreateButton("Abbrechen",120,$Items[0]*40)
    GUISetState()
    Do
    $msg2 = GUIGetMsg()
    Switch $msg2
    Case $save
    For $i = 1 To $Items[0]
    _GUICtrlListViewSetItemText($hListView,$index,$i-1,GuiCtrlread($Start+1))

    Next
    ExitLoop
    Case $cancel
    ExitLoop
    EndSwitch
    Until $msg2 = $GUI_EVENT_CLOSE
    GuiDelete($GUI)
    EndSwitch
    Until $msg = $GUI_EVENT_CLOSE
    GUIDelete()

    [/autoit]