📄 form1.vb
字号:
Public Class Form
Inherits System.Windows.Forms.Form
#Region "Windows 窗体设计器生成的代码"
Public Sub New()
MyBase.New()
'此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
End Sub
'窗体重写处置,以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal Disposing As Boolean)
If Disposing Then
If Not components Is Nothing Then
components.Dispose()
End If
End If
MyBase.Dispose(Disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
Public ToolTip1 As System.Windows.Forms.ToolTip
Public WithEvents Dir1 As Microsoft.VisualBasic.Compatibility.VB6.DirListBox
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器来修改它。
'不要使用代码编辑器修改它。
Public WithEvents Treeview1 As AxMSComctlLib.AxTreeView
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form))
Me.ToolTip1 = New System.Windows.Forms.ToolTip(Me.components)
Me.Dir1 = New Microsoft.VisualBasic.Compatibility.VB6.DirListBox
Me.Treeview1 = New AxMSComctlLib.AxTreeView
CType(Me.Treeview1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'Dir1
'
Me.Dir1.BackColor = System.Drawing.SystemColors.Window
Me.Dir1.Cursor = System.Windows.Forms.Cursors.Default
Me.Dir1.ForeColor = System.Drawing.SystemColors.WindowText
Me.Dir1.IntegralHeight = False
Me.Dir1.Location = New System.Drawing.Point(88, 104)
Me.Dir1.Name = "Dir1"
Me.Dir1.Size = New System.Drawing.Size(81, 34)
Me.Dir1.TabIndex = 1
Me.Dir1.Visible = False
'
'Treeview1
'
Me.Treeview1.Location = New System.Drawing.Point(0, 8)
Me.Treeview1.Name = "Treeview1"
Me.Treeview1.OcxState = CType(resources.GetObject("Treeview1.OcxState"), System.Windows.Forms.AxHost.State)
Me.Treeview1.Size = New System.Drawing.Size(449, 273)
Me.Treeview1.TabIndex = 0
'
'Form
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.BackColor = System.Drawing.SystemColors.Control
Me.ClientSize = New System.Drawing.Size(456, 290)
Me.Controls.Add(Me.Dir1)
Me.Controls.Add(Me.Treeview1)
Me.Cursor = System.Windows.Forms.Cursors.Default
Me.Location = New System.Drawing.Point(4, 23)
Me.Name = "Form"
Me.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Text = "使用Treeview控件"
CType(Me.Treeview1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Form_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
' 初始化控件的内容
Call InitTreeData()
Treeview1.Nodes(1).Selected = True ' 根节点为当前节点
Treeview1.Nodes(1).EnsureVisible() ' 根节点可见
End Sub
' 初始化控件的内容,为TreeView控件增加4层目录
Private Sub InitTreeData()
' 首先增加最顶级,即根目录
Treeview1.Nodes.Add(, , "R", "D:\")
' 调用递归函数增加后5级目录
AddDir(Treeview1.Nodes(1).Index, 1, 6)
Treeview1.Nodes(1).Expanded = True
End Sub
' 递归函数,为当前节点及其同层节点增加各自的子节点,到nLastLevel级节点结束
Private Sub AddDir(ByVal nCurIndex As Short, ByVal nLevel As Short, ByVal nLastLevel As Short)
Dim nodIndex As Short
' 已经到达结束层
If nLevel >= nLastLevel Then
Exit Sub
End If
' 获得指定节点的同层第一个节点索引
nodIndex = Treeview1.Nodes(nCurIndex).FirstSibling.Index
' 为该层节点逐个增加子节点
Do While nodIndex <> Treeview1.Nodes(nCurIndex).LastSibling.Index
' 当前节点不是该层的最后一个节点时
' 为指定节点增加子节点
AddNodeForOne(nodIndex)
If Treeview1.Nodes(nodIndex).Children > 0 Then
' 如果有子节点,则为所有子节点加子节点
AddDir(Treeview1.Nodes(nodIndex).Child.Index, nLevel + 1, nLastLevel)
End If
' 指向下一个同层节点
nodIndex = Treeview1.Nodes(nodIndex).Next.Index
Loop
' 为同层最末节点增加子节点
AddNodeForOne(nodIndex)
If Treeview1.Nodes(nodIndex).Children > 0 Then
' 如果有子节点,则为所有子节点加子节点
AddDir(Treeview1.Nodes(nodIndex).Child.Index, nLevel + 1, nLastLevel)
End If
End Sub
' 为指定节点增加子节点
Private Sub AddNodeForOne(ByVal nodIndex As Short)
Dim nodItem As MSComctlLib.Node
Dim i As Short
nodItem = Treeview1.Nodes(nodIndex) ' 当前节点
Dir1.Path = Treeview1.Nodes(nodIndex).Text ' 当前目录
i = 0
Do While i < Dir1.DirListCount ' 增加子目录做子节点,以父节点的Key+i做新节点的Key
Treeview1.Nodes.Add(nodItem.Key, MSComctlLib.TreeRelationshipConstants.tvwChild, nodItem.Key & "-" & VB6.Format(i), Dir1.DirList(i))
i = i + 1
Loop
nodItem.Expanded = True
End Sub
' 选取节点
Private Sub Treeview1_NodeCheck(ByVal eventSender As System.Object, ByVal eventArgs As AxMSComctlLib.ITreeViewEvents_NodeCheckEvent) Handles Treeview1.NodeCheck
gCheckChildrenBySelf(Treeview1, eventArgs.node.Index, eventArgs.node.Checked)
gCheckParentBySibling(Treeview1, eventArgs.node.Index)
End Sub
' 根据自身选取情况,确定全选或取消其下所有子项
Private Sub gCheckChildrenBySelf(ByRef Treeview1 As AxMSComctlLib.AxTreeView, ByVal curIndex As Short, ByVal bCh As Short)
Dim n As Short
If Treeview1.Nodes(curIndex).Children <= 0 Then
Exit Sub
Else
n = Treeview1.Nodes(curIndex).Child.Index
Do While n <> Treeview1.Nodes(curIndex).Child.LastSibling.Index
Treeview1.Nodes(n).Checked = bCh
gCheckChildrenBySelf(Treeview1, n, bCh)
n = Treeview1.Nodes(n).Next.Index
Loop
Treeview1.Nodes(n).Checked = bCh
gCheckChildrenBySelf(Treeview1, n, bCh)
End If
End Sub
' 根据同层、同父节点的选取情况,确定是否选取其父(乃至更上层),直至根节点
Private Sub gCheckParentBySibling(ByRef Treeview1 As AxMSComctlLib.AxTreeView, ByVal curIndex As Short)
Dim n As Short
Dim bHaveChecked As Boolean
If Treeview1.Nodes(curIndex).FirstSibling.Index = 1 Then
Exit Sub
Else
bHaveChecked = False
n = Treeview1.Nodes(curIndex).FirstSibling.Index
Do While n <> Treeview1.Nodes(curIndex).LastSibling.Index
If Treeview1.Nodes(n).Checked = True Then
bHaveChecked = True
Exit Do
End If
n = Treeview1.Nodes(n).Next.Index
Loop
If Treeview1.Nodes(n).Checked = True Then
bHaveChecked = True
End If
If bHaveChecked = True Then
Treeview1.Nodes(curIndex).Parent.Checked = System.Windows.Forms.CheckState.Checked
Else
Treeview1.Nodes(curIndex).Parent.Checked = System.Windows.Forms.CheckState.Unchecked
End If
gCheckParentBySibling(Treeview1, Treeview1.Nodes(curIndex).Parent.Index)
End If
End Sub
Private Sub Treeview1_BeforeLabelEdit(ByVal sender As System.Object, ByVal e As AxMSComctlLib.ITreeViewEvents_BeforeLabelEditEvent) Handles Treeview1.BeforeLabelEdit
End Sub
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -