我也碰到过这个问题,由于找不到好办法,所以用了一个比较麻烦的办法:
    给每行加一列,用于存储每行的位置如:
"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以刷新界面就可以了。

解决方案 »

  1.   

    Const LB_ITEMFROMPOINT = &H1A9
    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
      

  2.   

    '将lINdex位置的删除,然后在l位置建立一个于lIndex相同的纪录这点怎么实现?
      

  3.   

    完整的代码,你看是否可以:Const LB_ITEMFROMPOINT = &H1A9
    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
      

  4.   

    TechnoFantasy,谢谢您的回答
    我试了一下,有些问题,程序没有反应
    我把代码拷到MouseUp和MouseDown中,可以实现改变的功能,不过正常的Click选中不能正常工作,我想我对拖动过程和原理不太明白,希望能再次指教
    再次感谢您
      

  5.   

    我试了一下,可以,须要先将List的OLEDragMode以及OLEDropMode都设定为1。
    对于OLE拖放,如果讲原理比较长,而且对于太深入的东西我也不是有太多了解,还须要高手来指教。