当我加载它时,我的树 View 折叠起来,所以它大约有 100x150 像素大。展开时,我希望树 View 显示所有展开的节点。
为了做到这一点,随着树 View 变大,表单需要变大,对吗?我是 VB.net 的新手,我试图在树 View 中找到一个“GrowOnly”属性,但我找不到……有没有人做过这个?
最佳答案
处理 AfterExpand/AfterCollapse 事件
添加事件处理程序 AfterExpand 和 AfterCollapse 以使树 View 对节点的展开/折叠使用react。我对这个例子的填充进行了硬编码,但本质上这只是用于调整表单大小的菜单、按钮等的高度。
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 设置为表单。为了使 树 View 与表单一起正确调整大小, 将 anchor 定到 顶部和底部 。
递归遍历节点
该函数将遍历根节点并在打开的节点上调用递归函数。
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
现在只需使用递归函数继续增加 TreeViewHeight,该函数将返回在当前树 View 中展开的所有节点的高度 (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
视觉再现
这是我们完成后的样子:
我们从一个折叠的树 View 开始
然后我们可以展开一些节点,表格会相应地增长
然后我们可以重新折叠节点并展开更多,形式再次调整!
请原谅我截图中的法语,这是魁北克的常态......我们有义务这样做!