我在面板内停靠了System.Windows.Forms.TreeView
。我正在设置以编程方式选择的节点。我将使用什么方法或属性让树视图将所选内容滚动到视图中?
答案 0 :(得分:34)
node.EnsureVisible();
例如:
if(treeView.SelectedNode != null) treeView.SelectedNode.EnsureVisible();
(见MSDN)
答案 1 :(得分:1)
我也遇到了这个问题,并且发现treeview.ExpandAll()忽略了EnsureVisible()效果并避免滚动到节点位置。
如果你想在你选择的节点上滚动一个完整的展开树,只需在ExpandAll()之后调用EnsureVisible()。
答案 2 :(得分:0)
我遇到一些问题,node.EnsureVisible()
不适用于只有一级节点的树。
要解决此问题,请使用BindingIndex
标识所选节点。然后,将在视图中滚动选定的节点。
该示例显示LINQ查询中的myTable
。
node.BindingIndex = Convert.ToInt32(mytable.Id);
我希望这有助于你们中的一些人。
答案 3 :(得分:0)
为确保所选项目的可见性:
private void EnsureItemVisible()
{
if(treeView1.SelectedNode == null)
{
return;
}
for (int i = treeView1.SelectedNode.Index + treeView1.VisibleCount / 2; i >= 0; i--)
{
if (treeView1.Nodes.Count > i && treeView1.Nodes[i] != null)
{
treeView1.Nodes[i].EnsureVisible();
break;
}
}
for (int i = treeView1.SelectedNode.Index - treeView1.VisibleCount / 2; i < treeView1.Nodes.Count; i++)
{
if (i >= 0 && treeView1.Nodes[i] != null)
{
treeView1.Nodes[i].EnsureVisible();
break;
}
}
}
处理TreeView选择已更改:
private void TreeView_AfterSelect(object sender, TreeViewEventArgs e)
{
EnsureItemVisible();
}
答案 4 :(得分:0)
我发现可靠的工作是:
这将导致所需的节点和展开的子代放置在树视图显示区域的顶部。
TVFolders.BeginUpdate();
TVFolders.Nodes.Clear();
TreeNode tn = new TreeNode()
{
Text = RootFolderPath,
Name = RootFolderPath
};
TVFolders.Nodes.Add(tn);
// load the treeview (also tracks the last node added to the tree as lastNode)
PopulateTreeView(TVFolders.Nodes[0], RootFolderPath, 6, true);
// if user/caller has specified a start path, select and expand it
if (_SelectedPath != null)
{
// find the node corresponding to the requested path
TreeNode[] tns = TVFolders.Nodes.Find(_SelectedPath, true);
// assumes first return is the "best" one
if (tns.Length > 0)
{
// select the requested node
TVFolders.SelectedNode = tns[0];
// expand to show children
TVFolders.SelectedNode.Expand();
// scroll to the last node on the tree (may push our node off top)
if (lastNode != null)
{
lastNode.EnsureVisible();
}
// scroll to our node, which will now be at the top of the display area
TVFolders.SelectedNode.EnsureVisible();
}
}
TVFolders.Visible = true;
TVFolders.EndUpdate();