如何让节点展开时
TreeView
改变宽度,使节点的标签完全显示出来。
首先我设置
DrawMode = OwnerDrawAll;
然后处理事件
DrawNode
并在处理程序中
e.DrawDefault = true;
currentWith_ = Math.Max(currentWith_, e.Node.Bounds.Right);
然后在
AfterExpand
中设置控件。但并不是每次都有效。有时 with 没有更改或更改不正确。
如何纠正这个问题。 预先感谢。
试试这个,成功了:
private void treeViewAfterExpand(object sender, TreeViewEventArgs e)
{
int maxRight = treeView.ClientSize.Width;
if(e.Node.Nodes != null)
foreach (TreeNode node in e.Node.Nodes)
{
maxRight = Math.Max(maxRight, node.Bounds.Right);
}
treeView.ClientSize = new Size(maxRight, treeView.ClientSize.Height);
}
Ria给出的解决方案有效,但在构造函数中扩展时无效。在加载事件而不是构造函数中扩展使其工作。 (无法评论,因为低于 50 分。)
考虑隐藏节点的解决方案。
假设您的 TreeView (tvSamples) 位于 SplitContainer (scPaths) 中,并且您希望在表单调整大小时调整 SplitContainer 的宽度以适合 TreeView 的内容:
Private TREEVIEWPADDING As Integer = 10
Private Sub treeViewAfterExpand(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles tvSamples.AfterExpand
scTree.SplitterDistance = TreeViewWidth(tvSamples.Nodes, 0) + TREEVIEWPADDING
End Sub
Private Function TreeViewWidth(node As TreeNode, maxwidth As Integer) As Integer
If node.IsVisible Then
If node.Nodes IsNot Nothing Then
Return Max(maxwidth, TreeViewWidth(node.Nodes, maxwidth))
Else
Return Max(maxwidth, node.Bounds.Right)
End If
Else
Return maxwidth
End If
End Function
Private Function TreeViewWidth(nodes As TreeNodeCollection, maxwidth As Integer) As Integer
Dim result As Integer = maxwidth
For Each node As TreeNode In nodes
If node.IsVisible Then
result = Max(result, TreeViewWidth(node, node.Bounds.Right))
End If
Next
Return result
End Function
Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
scTree.SplitterDistance = TreeViewWidth(tvSamples.Nodes, 0) + scPaths.SplitterWidth + TREEVIEWPADDING
End Sub