我也碰到过这个问题,由于找不到好办法,所以用了一个比较麻烦的办法:
给每行加一列,用于存储每行的位置如:
"xxx" "xxx" "1"
"xxx" "xxx" "2"
"xxx" "xxx" "3"
"1"代表此行为第一行,"3"代表第3行,并将sorted属性设为true,sortkey设为这列的index
当拖动第3行至第1行时,将3改为1,将1改为2,将2改为3,最后再次将sorted设为true以刷新界面就可以了。
给每行加一列,用于存储每行的位置如:
"xxx" "xxx" "1"
"xxx" "xxx" "2"
"xxx" "xxx" "3"
"1"代表此行为第一行,"3"代表第3行,并将sorted属性设为true,sortkey设为这列的index
当拖动第3行至第1行时,将3改为1,将1改为2,将2改为3,最后再次将sorted设为true以刷新界面就可以了。
Dim lXPoint As Long
Dim lYPoint As Long
Dim lIndex As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As LongPrivate Sub Form_Load()
Dim i
For i = 1 To 200
List1.AddItem Str(i) + " Samples in this list is " + Str(i)
Next i
End SubPrivate Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim l As Long
'获得光标的位置,以像素为单位
lXPoint = CLng(X / Screen.TwipsPerPixelX)
lYPoint = CLng(Y / Screen.TwipsPerPixelY)
'
With List1
'获得 光标所在的标题行的索引
l = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, _
ByVal ((lYPoint * 65536) + lXPoint))
'将ListBox的Tooltip设置为该标题行的文本
If (l >= 0) And (lIndex >= 0) Then
'将lINdex位置的删除,然后在l位置建立一个于lIndex相同的纪录
End If
End With
End SubPrivate Sub List1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
lIndex = List1.ListIndex
Debug.Print lIndex
End Sub
Dim lXPoint As Long
Dim lYPoint As Long
Dim lIndex As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As LongPrivate Sub Form_Load()
Dim i
For i = 1 To 200
List1.AddItem Str(i) + " Samples in this list is " + Str(i)
Next i
End SubPrivate Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim l As Long
'获得光标的位置,以像素为单位
lXPoint = CLng(X / Screen.TwipsPerPixelX)
lYPoint = CLng(Y / Screen.TwipsPerPixelY)
'
With List1
'获得 光标所在的标题行的索引
l = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, _
ByVal ((lYPoint * 65536) + lXPoint))
'将ListBox的Tooltip设置为该标题行的文本
If (l >= 0) And (lIndex >= 0) Then
Dim astr As String
astr = List1.List(lIndex)
List1.RemoveItem lIndex
List1.AddItem astr, l
'将lINdex位置的删除,然后在l位置建立一个于lIndex相同的纪录
End If
End With
End SubPrivate Sub List1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
lIndex = List1.ListIndex
End Sub
我试了一下,有些问题,程序没有反应
我把代码拷到MouseUp和MouseDown中,可以实现改变的功能,不过正常的Click选中不能正常工作,我想我对拖动过程和原理不太明白,希望能再次指教
再次感谢您
对于OLE拖放,如果讲原理比较长,而且对于太深入的东西我也不是有太多了解,还须要高手来指教。