⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.vb

📁 Visual.Basic.NET实用编程百例-47.6M.zip
💻 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 + -