将选定的TreeView节点滚动到视图中

时间:2009-01-19 15:18:23

标签: c# winforms treeview

我在面板内停靠了System.Windows.Forms.TreeView。我正在设置以编程方式选择的节点。我将使用什么方法或属性让树视图将所选内容滚动到视图中?

5 个答案:

答案 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)

我发现可靠的工作是:

  1. 展开所需的节点
  2. 通过树的最后一个节点上的GuaranteeVisible()强制滚动到END
  3. 通过该节点上的GuaranteeVisible()滚动回到所需的节点

这将导致所需的节点和展开的子代放置在树视图显示区域的顶部。

        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();