如何禁止TreeView.ExpandAll方法自动滚动到树的末尾?

3

我有一个巨大的树,大约有1000个节点。当我使用TreeView.ExpandAll方法时,它会将整棵树滚动到底部,但不够平滑。如何使其滚动平滑或者干脆不滚动(保持在开头)?


有一个名为EnsureVisible的方法,可能是关键。这里有一些细节(http://social.msdn.microsoft.com/Forums/br/winforms/thread/47ad2f19-7d7c-4d37-b8d7-fa4bd341c832)。 - Michal Klouda
我赞同Michal的评论:treeView.Nodes[0].EnsureVisible(); 可以保持第一个节点可见。 - chrismead
它不会在.ExpandAll之前执行。 - Romz
其后,首先它显示结束,然后返回到开头。 - Romz
是的,那很有道理。我建议在beginupdate > expandall > endupdate之后调用ensurevisible(就像LarsTech所描述的那样)。实际上,我在我的树形视图中没有他提到的滚动条问题,但我有其他滚动条问题,所以我想这取决于各种因素。 - chrismead
3个回答

1

我最近也遇到了这个问题。在调用ExpandAll()方法后,我所做的就是将TreeView中的SelectedNode设置为第一个节点,像这样:

this.treeView1.ExpandAll();
this.treeView1.SelectedNode = this.treeView1.Nodes[0];

你需要小心,因为如果你的TreeView中没有节点,这可能会抛出异常,所以最好将其放置在try-catch块中。


1
通过使用TreeView控件的BeginUpdate()和EndUpdate()方法,您可以在向树添加节点时暂停TreeView控件的绘制。当涉及到显示控件的滚动条部分时,TreeView控件的ExpandAll()方法似乎忽略了这一点。
一个简单的解决方法是,在使用BeginUpdate()和EndUpdate()方法向TreeView控件添加节点分支之前,先展开父节点。
例如:
treeView1.BeginUpdate();
for (int i = 0; i < 4; ++i) {
  TreeNode tn = new TreeNode("Node #" + i.ToString());
  tn.Expand();
  for (int j = 0; j < 250; ++j) {
    tn.Nodes.Add("Child #" + j.ToString());
  }
 treeView1.Nodes.Add(tn);
}
treeView1.EndUpdate();

0

ExpandAll 之后立即使用 EnsureVisible 方法对我很有效:

tree.ExpandAll();
tree.Nodes[0].EnsureVisible();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接