25

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

4

5 回答 5

41
node.EnsureVisible();

例如:

if(treeView.SelectedNode != null) treeView.SelectedNode.EnsureVisible();

(见MSDN

于 2009-01-19T15:19:05.537 回答
1

我对此也有疑问,并发现 treeview.ExpandAll() 忽略了 EnsureVisible() 效果并避免滚动到节点位置。

如果您想要一个完整的扩展树并在您选择的节点上滚动,只需在 ExpandAll() 之后调用 EnsureVisible()。

于 2016-03-22T21:41:07.210 回答
1

要确保所选项目的可见性:

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();
}
于 2020-04-04T19:08:34.983 回答
0

node.EnsureVisible()对于只有一层节点的树,我遇到了一些问题。

要解决此问题,请使用BindingIndex标识选定的节点。然后选定的节点将在视图中滚动。

该示例显示myTable了一个 LINQ 查询。

node.BindingIndex = Convert.ToInt32(mytable.Id);

我希望这对你们中的一些人有所帮助。

于 2011-11-26T09:53:36.253 回答
0

我发现可靠工作的是:

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

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

        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();
于 2020-09-30T18:19:27.140 回答