Hej Du kan lägga ett par knapper på sidan om ListView. Markera en rad i listan och klicka på en av knapperna för att flytta upp resp. ned. Tack skall du ha! 'Modul: Module1 -------------------Flytta rad i listbox
Någon som har något tips på hur man kan flytta en rad i en listbox. Alltså antag att det finns två rader, på den översta står det rad1 och på den understa rad2. Jag vill att användaren skall kunna drag&drop'a rad1 så att den kommer under rad2. Det hade varit super om ItemData't hängde med oxå!
Det skall även fungera att "klämma in en rad emellan"Sv: Flytta rad i listbox
ItemData flyttas också.
cmdNed_Click
Dim readitemindex As Integer
Dim readitem As String
Dim readitemData As Integer
If List2.ListIndex = -1 Then Exit Sub 'inget är valt i listan
If List2.ListCount > 1 Then 'Det finns fler än två rader i listan
'Kolla om man redan står på sista raden
If Not List2.ListIndex + 1 = List2.ListCount Then
'Spara texten, indexet och ItemData
readitem = List2.List(List2.ListIndex)
readitemindex = List2.ListIndex
readitemData = List2.ItemData(List2.ListIndex)
'ta bort raden
List2.RemoveItem (List2.ListIndex)
'den nedanför åker upp och jag lägger dit min nya
List2.AddItem readitem, readitemindex + 1
'tala om att nytt index ska gälla
List2.ListIndex = readitemindex + 1
List2.ItemData(List2.NewIndex) = readitemData
End If
End If
End Sub
cmdUpp_Click
Dim readitemindex As Integer
Dim readitem As String
Dim readitemData As Integer
If List2.ListIndex = -1 Then Exit Sub 'inget är valt i listan
If Not List2.ListIndex = 0 'Man står redan längst upp
'Spara texten, indexet och ItemData
readitem = List2.List(List2.ListIndex)
readitemindex = List2.ListIndex
readitemData = List2.ItemData(List2.ListIndex)
'ta bort raden
List2.RemoveItem (List2.ListIndex)
'den nedanför åker upp och jag lägger dit min nya
List2.AddItem readitem, readitemindex - 1
'tala om att nytt index ska gälla
List2.ListIndex = readitemindex - 1
List2.ItemData(List2.NewIndex) = readitemData
End If
End If
End Sub
Du kan säkert snygga till det så att även multiselect och dra och släpp fungerar. Den här koden fungerar bara om listan har egenskapen multiselect = 0
Du kan säkert baka ihop bägge delarna till en procedur och skicka med upp resp ned som parametrar.
/LasseSv: Flytta rad i listbox
Men det hade nog ändå varit smidigare om man kunde darg & drop'a. Någon som har koll på detta?Sv: Flytta rad i listbox
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Long) As Long
Private Const LB_GETITEMHEIGHT = &H1A1
Public Function ListRowCalc(lstTemp As ListBox, ByVal Y As Single) As Integer
Dim ItemHeight As Integer
'Determines the height of each item in ListBox control in pixels
ItemHeight = SendMessage(lstTemp.hWnd, LB_GETITEMHEIGHT, 0&, 0&)
ListRowCalc = Min(((Y / Screen.TwipsPerPixelY) \ ItemHeight) + lstTemp.TopIndex, lstTemp.ListCount - 1)
End Function
Function Min(X As Integer, Y As Integer) As Integer
If X > Y Then Min = Y Else Min = X
End Function
Sub ListRowMove(lstTemp As ListBox, ByVal OldRow As Integer, ByVal NewRow As Integer)
Dim List As String
Dim ItemData As Long
Dim i As Integer
If OldRow <> NewRow Then
List = lstTemp.List(OldRow)
ItemData = lstTemp.ItemData(OldRow)
If OldRow > NewRow Then
For i = OldRow To NewRow + 1 Step -1
lstTemp.List(i) = lstTemp.List(i - 1)
lstTemp.ItemData(i) = lstTemp.ItemData(i - 1)
Next i
Else
For i = OldRow To NewRow - 1
lstTemp.List(i) = lstTemp.List(i + 1)
lstTemp.ItemData(i) = lstTemp.ItemData(i + 1)
Next i
End If
lstTemp.List(NewRow) = List
lstTemp.ItemData(NewRow) = ItemData
End If
End Sub
'Form: Form1 -------------------
Option Explicit
Private DragIndex As Integer
Private Sub Form_Load()
List1.Clear
List1.AddItem "Adam"
List1.AddItem "Bob"
List1.AddItem "Charles"
List1.AddItem "David"
List1.AddItem "Eric"
List1.AddItem "Frank"
List1.AddItem "George"
End Sub
Private Sub List1_DragDrop(Source As Control, X As Single, Y As Single)
ListRowMove Source, DragIndex, ListRowCalc(Source, Y)
End Sub
Private Sub List1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Button = vbRightButton Then
DragIndex = ListRowCalc(List1, Y)
List1.Drag
End If
End Sub
Laggt till ItemData, annars skiljer sig den inte mycket från orginal artikeln på :
http://support.microsoft.com/support/kb/articles/q167/7/46.asp