Vb.net 动态树视图高度

Vb.net 动态树视图高度,vb.net,winforms,dynamic,treeview,height,Vb.net,Winforms,Dynamic,Treeview,Height,我的treeview在加载时会崩溃,因此它的大小约为100x150像素。展开后,我希望树视图显示所有展开的节点 为了做到这一点,表单需要随着树视图的变大而变大,对吗?我是VB.net的新手,我试图在树视图中找到一个“Growtonly”属性,但找不到。。。有人这样做过吗?您可以捕获和TreeView事件,以检测用户何时更改节点区域的高度。在该事件处理程序中,您需要找到最后一个节点的底部(使用Bounds属性),然后最终需要更改表单的高度 确保TreeView的属性同时包含top和bottom,以

我的treeview在加载时会崩溃,因此它的大小约为100x150像素。展开后,我希望树视图显示所有展开的节点

为了做到这一点,表单需要随着树视图的变大而变大,对吗?我是VB.net的新手,我试图在树视图中找到一个“Growtonly”属性,但找不到。。。有人这样做过吗?

您可以捕获和TreeView事件,以检测用户何时更改节点区域的高度。在该事件处理程序中,您需要找到最后一个节点的底部(使用
Bounds
属性),然后最终需要更改表单的高度

确保TreeView的属性同时包含top和bottom,以便它随窗体一起增长

Private Sub Rapports_tvAllReports_AfterExpand(sender As Object, e As System.Windows.Forms.TreeViewEventArgs) Handles Rapports_tvAllReports.AfterExpand, Rapports_tvAllReports.AfterCollapse
    Dim Padding As Integer = 140 'Customize this, basically accounts for all buttons or menus included in the form which nests the treeview
    Dim TreeViewHeight As Integer = GetOpenedNodesRecursively(Rapports_tvAllReports)

    If formWindow = FormWindowState.Normal Then Me.Size = New Size(345, TreeViewHeight + Padding)
End Sub
当然,形状必须比树视图高。底部节点的
Bounds.bottom
属性将不完全是树视图的底部,因此我下面的示例首先通过树视图和表单之间的高度差,然后通过树视图的客户端高度和树视图的总高度之间的差来扩大它。它在我这边正常工作

您应该将此相同的方法分配给
BeforeExpand
AfterExpand
事件。注意,它通过遍历节点来查找底部节点,从而查找最后一个节点;您需要检查以确保这保证为您提供最后一个节点

编辑:在开始任何操作之前,您需要告诉树滚动以显示第一个节点,以使其一致工作:因此调用
enseRevisible()

Private Sub TreeView1_BeforeOrAfterExpand(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterExpand, TreeView1.AfterCollapse
    Dim lastNode As TreeNode = TreeView1.Nodes(0)

    TreeView1.Nodes(0).EnsureVisible()

    While lastNode.LastNode IsNot Nothing And lastNode.IsExpanded
        lastNode = lastNode.LastNode
    End While

    Dim diffBetweenFormAndTreeview As Integer = Me.Height - TreeView1.Height
    Dim diffBetweenTreeviewTotalAndClient As Integer = TreeView1.Height - TreeView1.ClientSize.Height
    Me.Height = lastNode.Bounds.Bottom + diffBetweenFormAndTreeview + diffBetweenTreeviewTotalAndClient
End Sub
处理后展开/后折叠事件 添加事件处理程序AfterExpand和AfterCollapse,使treeview对节点的展开/折叠作出反应。我对本例中的填充进行了硬编码,但本质上这只是用于调整表单大小的菜单、按钮等的高度

Private Sub Rapports_tvAllReports_AfterExpand(sender As Object, e As System.Windows.Forms.TreeViewEventArgs) Handles Rapports_tvAllReports.AfterExpand, Rapports_tvAllReports.AfterCollapse
    Dim Padding As Integer = 140 'Customize this, basically accounts for all buttons or menus included in the form which nests the treeview
    Dim TreeViewHeight As Integer = GetOpenedNodesRecursively(Rapports_tvAllReports)

    If formWindow = FormWindowState.Normal Then Me.Size = New Size(345, TreeViewHeight + Padding)
End Sub
我们所要做的就是增加Y并将新的Y设置为形式。为了使树视图与表单一起正确调整大小,将其锚定到顶部和底部

递归遍历节点 此函数将遍历根节点,并在打开的节点上调用递归函数

Private Function GetOpenedNodesRecursively(ByVal aTreeView As TreeView)
    Dim Y As Integer = 0

    'Go through each node of the treeview (first level)
    For Each n As TreeNode In aTreeView.Nodes
        Y += Rapports_tvAllReports.ItemHeight

        'If the user expands a node, recursively increment the Y
        If n.IsExpanded Then Y += RecursiveYIncrement(n)
    Next

    Return Y
End Function
现在,只需使用递归函数不断增加TreeViewWheight,该函数将返回当前树视图中展开的所有节点的高度(Y)

Private Function RecursiveYIncrement(ByVal n As TreeNode)
    Dim Y As Integer = 0

    'Go through each node of the treeview (first level)
    For Each aNode As TreeNode In n.Nodes
        Y += Rapports_tvAllReports.ItemHeight

        'If the user expands a node, recursively increment the Y
        If aNode.IsExpanded Then Y += RecursiveYIncrement(aNode)
    Next

    Return Y
End Function
视觉复制 下面是我们完成后的外观:

我们从一个折叠的树视图开始

然后,我们可以展开一些节点,表单将相应地增长

然后我们可以重新折叠节点并展开更多,形状再次调整!


请原谅我截图中的法国人,这是魁北克的常态。。。我们有义务这样做

以下扩展函数对高度和宽度都起作用。树视图本身永远不会传入,只传入节点集合。参见下面的示例调用

''' <summary>
''' Measures the total height and width of all expanded tree nodes
''' </summary>
''' <param name="nodes">TreeNodeCollection which should be measured</param>
''' <returns>
'''     Size structure representing the height and width of a rectangle formed from
'''     the top-left of the first node in the collection, the right boundary of the
'''     right-most expanded node, and the bottom boundary of the bottom-most
'''     expanded node.
''' </returns>
<System.Runtime.CompilerServices.Extension()>
Public Function MeasureExpansion(nodes As TreeNodeCollection) As Size

    Dim size As New Size(0, 0)

    For Each node As TreeNode In nodes

        size.Height += node.Bounds.Height

        Dim newWidth As Integer = node.Bounds.Right

        If newWidth > size.Width Then
            size.Width = newWidth
        End If

        If node.IsExpanded Then

            Dim subNodeSize As Size = node.Nodes.MeasureExpansion()

            If subNodeSize.Width > size.Width Then
                size.Width = subNodeSize.Width
            End If

            size.Height += subNodeSize.Height

        End If

    Next

    Return size

End Function
“”
''测量所有扩展树节点的总高度和宽度
''' 
''应测量的树木采伐量
''' 
''尺寸结构,表示由
''集合中第一个节点的左上角,即
''最右侧展开的节点,以及最底部节点的底部边界
''扩展节点。
''' 
公共函数度量扩展(节点作为TreeNodeCollection)作为大小
将尺寸调整为新尺寸(0,0)
对于每个节点作为节点中的树节点
size.Height+=node.Bounds.Height
Dim newWidth为整数=node.Bounds.Right
如果newWidth>size.Width,则
size.Width=newWidth
如果结束
如果node.IsExpanded,则
Dim子节点大小为Size=node.Nodes.MeasureExpansion()
如果子节点大小.Width>大小.Width,则
size.Width=子节点化.Width
如果结束
大小.高度+=子节点大小.高度
如果结束
下一个
返回大小
端函数
下面的示例调用。请注意,示例treeview禁用了滚动条。如果允许滚动条,则可能需要填充生成的大小

tvDefinitions.Nodes.Clear()

<treeview loaded here>

tvDefinitions.ExpandAll()

tvDefinitions.Size = tvDefinitions.Nodes.MeasureExpansion()
tvDefinitions.Nodes.Clear()
tvDefinitions.ExpandAll()
tvDefinitions.Size=tvDefinitions.Nodes.MeasureExpansion()
还请注意,当树状视图中只有一个节点时,使用AfterExpand/AfterCollapse事件触发调整treeview的大小是不起作用的。事件不会触发