Toon posts:

[VB6]Listview dragdrop

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een listview met meerdere kolomen en rijen.
Nu wil ik de gebruiker de volgorde laten wijzigen van de rijen.
Dit door bijv. de rij naar de juiste plaats te slepen of met commandbuttons die de geselecteerde rij naar boven of beneden verplaatst.
Nu heb ik al wat gezocht en heb ik de volgende oplossing bedacht in pseudocode:

Rij1 is de geselecteerde rij.
NewPos is de nieuwe positie waar de rij naar toe moet.
Voeg op NewPos een item toe en vervolgens alle subitems met dezelfde waarden als Rij1, verwijder vervolgens de oude rij (Rij1) door eerst de subitems te verwijderen en vervolgens het item zelf.
Dit komt uit een voorbeeldje van dragdrop in een listbox.

Nu lijkt me dit wat omslachtig. Is er niet een handiger manier om een geselecteerde rij naar een andere positie te verplaatsen?

Graag verneem ik jullie suggesties.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zit gewoon standard in de listview hoor?
Zet AllowColumnReorder op true et voila...

ooops :X
RIJEN :Y)

Maar verder klopt je idee aardig. Je kunt alleen meteen het "oude listitem" wegflikkeren, je hoeft niet eerst de subitems leeg te maken.

Misschien kun je ook de .Index van een listitem wijzigen ofzo... geen idee eigenlijk, heb het nog nooit nodig gehad :+

offtopic:
feli met je 100ste post :+


edit:

...Heb effe wat gespeeld...

Ok, klein voorbeeldje:

Plemp een listview (naam = LV) op je form, geef die 3 kolommen en zet 'm op report view.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Private Sub Form_Load()
    Dim li As ListItem
    Dim t As Long
    
    For t = 1 To 5
        Set li = LV.ListItems.Add(, , "Bla" & t)
        li.SubItems(1) = "Jedda" & t
        li.SubItems(2) = "Oink" & t
    Next
End Sub

Private Sub LV_DragDrop(Source As Control, x As Single, y As Single)
    Dim target As ListItem, tmp As ListItem, tmpnew As ListItem
    Dim t As Integer
    
    If Source.Name = LV.Name Then
        Set target = LV.HitTest(x, y)
        If Not target Is Nothing Then
            Set tmp = LV.SelectedItem
            Set tmpnew = LV.ListItems.Add(target.Index, tmp.Key, tmp.Text, tmp.Icon, tmp.SmallIcon)
            For t = 1 To LV.ColumnHeaders.Count - 1
                tmpnew.SubItems(t) = tmp.SubItems(t)
            Next
            LV.ListItems.Remove (LV.SelectedItem.Index)
        End If
    End If
End Sub

Private Sub LV_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = vbLeftButton Then
        If Not LV.HitTest(x, y) Is Nothing Then
            Set LV.SelectedItem = LV.HitTest(x, y)
            LV.Drag vbBeginDrag
        End If
    End If
End Sub

Zorg dat je het dragicon property op een leuk icoontje zet et voila. Rest mag je naar eigen inzicht aanpassen.

[ Voor 188% gewijzigd door RobIII op 31-08-2004 12:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
@RobIII:
Bedankt voor je voorbeeld, ik ga het dadelijk uitproberen. Ik heb HitTest nog niet eerder gebruikt, leuk om daar ook een toepassing voor te zien ;)

offtopic:
Bedankt voor je felicitaties, maar.... (tis misschien een onnozele vraag) hoe kun je zien dat het mijn 100ste post is? Ikzelf zie dat niet.

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

offtopic:
Boven in het scherm, naast het Tweakers logo, heb je de link staan met de naam 'myreact'. Als je daar op klikt dan kom je op een nieuwe pagina uit. Net onder je usericon kun je zien hoeveel posts je hebt gedaan hier op het forum.

Verwijderd

Topicstarter
@RobIII:
Ik heb de code toegepast en het werkt prima! _/-\o_

Ik heb alleen nog dit stukje toegevoegd:
code:
1
2
3
4
5
Private Sub lv_DragOver(Source As Control, x As Single, y As Single, State As Integer)
  With lv
    Set .DropHighlight = .HitTest(x, y)
  End With
End Sub


Nogmaals bedankt.
Weer wat geleerd of listviews en DragDrop :*)