参阅:
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
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
然后将下列代码粘贴到窗体中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) 这句话
HOWTO: Scroll the TreeView When Dragging and Dropping a Node
http://support.microsoft.com/support/kb/articles/Q177/7/43.asp
[email protected]