参阅:
playyuer(女㊣爱),你是斑竹,问你个简单的问题
如何将listview中显示出来的记录拖到treeview中去!??我急用!!
http://www.csdn.net/expert/topic/200/200901.shtm'下面是一个更完整的例子
'实现
'1.从 Listview 拖拽 Item 加到 Treeview 的 Node
'2.添加 Treeview 节点时,越界可"自动滚动"!!!!!
'3.编辑节点的 Text
'Objects:
'Form1、Treeview1、Listview1、Timer1、Command1
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_VSCROLL = &H115
Private Const WM_HSCROLL = &H114
Dim bIsLvwItemDblClick As Boolean
Dim bIsTvwNodeDblClick As Boolean
Dim mfX As Single
Dim mfY As Single
Private Enum ScrollDirection
    VScrollBarUp = 0
    HScrollBarRight = 1
    VScrollBarDown = 2
    HScrollBarLeft = 3
End Enum
Dim sdX As ScrollDirection
Private Sub Command1_Click()
Dim Nodex As MSComctlLib.Node
If TreeView1.SelectedItem Is Nothing Then
   Set Nodex = TreeView1.Nodes.Add(, , GetNextKey(), "")
Else
   Set Nodex = TreeView1.Nodes.Add(TreeView1.SelectedItem, tvwChild, GetNextKey() & ListView1.SelectedItem.Text, ListView1.SelectedItem.Text)
   
End If
Nodex.Selected = True
'TreeView1.SelectedItem.Expanded = TrueTreeView1.StartLabelEdit
End SubPrivate Sub Form_DragOver(Source As Control, x As Single, y As Single, State As Integer)
If Source Is TreeView1 Then
   Timer1.Enabled = False
End If
End Sub
Private Sub Form_Load()
Dim i As Integer
Timer1.Enabled = False
Timer1.Interval = 200
TreeView1.Style = tvwTreelinesPlusMinusPictureText
For i = 1 To 50
    TreeView1.Nodes.Add , , GetNextKey, "Node " & i
Next i
TreeView1.HideSelection = FalseTreeView1.LabelEdit = tvwManualListView1.ListItems.Add , , "cc"
ListView1.ListItems.Add , , "dd"ListView1.OLEDragMode = ccOLEDragAutomatic
ListView1.LabelEdit = lvwManual
ListView1.HideSelection = False
End Sub
Private Sub ListView1_DblClick()
If bIsLvwItemDblClick Then
   MsgBox ListView1.SelectedItem.Text
End If
End Sub
Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbLeftButton Then
   ListView1.DragIcon = ListView1.SelectedItem.CreateDragImage
   ListView1.Drag vbBeginDrag
Else
   If ListView1.HitTest(x, y) Is ListView1.SelectedItem Then
      bIsLvwItemDblClick = True
   Else
      bIsLvwItemDblClick = False
   End If
End If
End SubPrivate Sub TreeView1_AfterLabelEdit(Cancel As Integer, NewString As String)
If VBA.Len(NewString) <= 0 Then
   MsgBox "error"
   TreeView1.StartLabelEdit
   Cancel = 1
   
End If
End SubPrivate Sub TreeView1_DblClick()
If bIsTvwNodeDblClick Then
   MsgBox TreeView1.SelectedItem.Text
End If
End Sub
Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
If Not TreeView1.DropHighlight Is Nothing Then
   Dim Nodex As MSComctlLib.Node
   Set Nodex = TreeView1.Nodes.Add(TreeView1.DropHighlight.Key, tvwChild, GetNextKey() & ListView1.SelectedItem.Text, ListView1.SelectedItem.Text)
   TreeView1.DropHighlight.Expanded = True
   Nodex.Selected = True
   TreeView1.StartLabelEdit
End If
Timer1.Enabled = False
End Sub
Private Sub TreeView1_DragOver(Source As Control, x As Single, y As Single, State As Integer)
Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
mfX = x
mfY = y
If y > 0 And y < 100 Then
   sdX = VScrollBarUp
   Timer1.Enabled = True
ElseIf y > (TreeView1.Height - 400) And y < TreeView1.Height Then
   sdX = VScrollBarDown
   Timer1.Enabled = True
ElseIf x > 0 And x < 100 Then
   sdX = HScrollBarLeft
   Timer1.Enabled = True
ElseIf x > (TreeView1.Width - 400) And x < TreeView1.Width Then
   sdX = HScrollBarRight
   Timer1.Enabled = True
Else
   Timer1.Enabled = False
End If
End Sub
Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If TreeView1.HitTest(x, y) Is TreeView1.SelectedItem Then
   bIsTvwNodeDblClick = True
Else
   bIsTvwNodeDblClick = False
End If
End Sub
Private Sub Timer1_Timer()
Set TreeView1.DropHighlight = TreeView1.HitTest(mfX, mfY)
Select Case sdX
       Case VScrollBarUp
            SendMessage TreeView1.hwnd, WM_VSCROLL, 0, vbNull
       Case VScrollBarDown
            SendMessage TreeView1.hwnd, WM_VSCROLL, 1, vbNull
       Case HScrollBarLeft
            SendMessage TreeView1.hwnd, WM_HSCROLL, 0, vbNull
       Case HScrollBarRight
            SendMessage TreeView1.hwnd, WM_HSCROLL, 1, vbNull
End Select
End Sub
Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Timer1.Enabled = False
End Sub
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
TreeView1.DropHighlight = TreeView1.HitTest(x, y)
If Not TreeView1.DropHighlight Is Nothing Then
   TreeView1.SelectedItem = TreeView1.HitTest(x, y)
End If
Set TreeView1.DropHighlight = Nothing
End Sub
Private Function GetNextKey() As String
Dim sNewKey As String
Dim iHold As Integer
Dim i As Integer
On Error GoTo myerr
iHold = Val(TreeView1.Nodes(1).Key)
For i = 1 To TreeView1.Nodes.Count
    If Val(TreeView1.Nodes(i).Key) > iHold Then
       iHold = Val(TreeView1.Nodes(i).Key)
    End If
Next
iHold = iHold + 1
sNewKey = VBA.CStr(iHold) & "_"
GetNextKey = sNewKey
Exit Function
myerr:
GetNextKey = "1_"
End Function

解决方案 »

  1.   

    要试用本例请在窗体上加一个TreeView名为TreeView1,和一个ListView名为ListView1
    然后将下列代码粘贴到窗体中Private Sub Form_Load()
        TreeView1.Nodes.Add , , , "目录一"
        TreeView1.Nodes.Add , , , "目录二"
        TreeView1.Nodes.Add , , , "目录三"
        
        ListView1.ColumnHeaders.Add , , "文件名"
        ListView1.ListItems.Add , , "文件一"
        ListView1.ListItems.Add , , "文件二"
        ListView1.ListItems.Add , , "文件三"    '以下属性的设置是为了突出演示的效果
        TreeView1.HideSelection = False
        ListView1.View = lvwReport
        ListView1.LabelEdit = lvwManual
        ListView1.DragMode = vbManual
        '这里随便取了个可能在每个人的机器上都有的图标,目的是为了大家试用时的方便
        '大家可以自己换合适的图标
        ListView1.DragIcon = LoadPicture("c:\windows\winupd.ico")
    End Sub
    Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
        If Button = vbLeftButton Then
            ListView1.Drag
        End If
    End Sub
    Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
        MsgBox "你把文件拖到了  " & TreeView1.DropHighlight.Text, vbInformation
    End SubPrivate Sub TreeView1_DragOver(Source As Control, x As Single, y As Single, State As Integer)
       Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
    End Sub关键是    Set TreeView1.DropHighlight = TreeView1.HitTest(x, y) 这句话
      

  2.   

    这里还有一个微软官方的文章:
    HOWTO: Scroll the TreeView When Dragging and Dropping a Node
    http://support.microsoft.com/support/kb/articles/Q177/7/43.asp
      

  3.   

    只能在Microsoft Windows Common Controls 6.0下才能实现,而且不能一次移动多个Item。如果在5.0下怎么实现啊?程序里面的MSComctlLib是什么东西啊,我在MSDN里都查不到?唉,api 
      

  4.   

    吴文智(Clevertiger,heartfultiger...),你好,谢谢你的代码。为了实现这个drag,我找了一天,没想到你的代码这么简单就实现了。还以为非得用api不可呢。thinkssssss!!!!!
    [email protected]