【问题标题】:How to get next immediate node from the selected node of the Treeview in C#?如何从 C# 中 Treeview 的选定节点获取下一个直接节点?
【发布时间】:2011-06-15 09:24:52
【问题描述】:

我有一个 C# Windows 窗体中的 TreeView。如果用户选择了一个节点,那么我想检索树视图的下一个节点以及前一个节点。不要考虑是兄弟姐妹还是其他。我只想获取下一个节点和上一个节点。

看这张图:

假设用户选择以下案例 ==> 我要检索此节点

  1. 0 1.Sample Data ==>1 当多个代理时...

  2. 1 当多个代理时... ===>2 第二大...

  3. 2 第二大调... ===>3 在这种情况下....

  4. 3 在这种情况下.... ===>4 2.目标设置...

等等..

我怎样才能做到这一点?

【问题讨论】:

    标签: c# winforms c#-4.0 treeview


    【解决方案1】:

    使用e.Node.NextNodee.Node.PrevNode 作为兄弟节点。

    TreeNode.NextNode Property

    TreeNode.PrevNode Property

    编辑

    e.Node.NextVisibleNodee.Node.PrevVisibleNode 在您的情况下用于可见节点。

    TreeNode.NextVisibleNode Property

    TreeNode.PrevVisibleNode Property

    其他TreeNode属性请参考MSDN:TreeNode Properties

    【讨论】:

    • nextNode 或 prevNode 仅返回其兄弟节点...我想要立即下一个和上一个节点...有关更多详细信息,请参阅更新的问题...
    • 使用 PrevVisibleNode 和 NextVisibleNode 然后,查看我的更新
    • @Saravanan,所以在检查下一个/上一个节点之前让你的程序展开树视图。
    • 那么问题出在哪里?有了上面的信息,我相信你可以结合这些属性并得到你所要求的。
    • 例如如果您的所有节点都已折叠,并且您在 0 1.Sample Data 上,则只需展开您选择的节点(在本例中为 0 1.Sample Data)并使用 NextVisibleNode 属性来获取 1 When multiple agents... 。在此之后,如果您愿意,您可以将其恢复为折叠状态(如果是)。
    【解决方案2】:
    TreeView tr = new TreeView();
    
    private void Form1_Load(object sender, EventArgs e)
    {
        tr.AfterSelect += new TreeViewEventHandler(tr_AfterSelect);
    }
    
    void tr_AfterSelect(object sender, TreeViewEventArgs e)
    {
        TreeNode PrevNode = e.Node.PrevNode;
        TreeNode NextNode = e.Node.NextNode;
    }
    

    对于可以这样做的情况:

    void tr_AfterSelect(object sender, TreeViewEventArgs e)
    {
    
        TreeNode NextNode;
    
        if (e.Node.Nodes.Count == 0)
        {
            NextNode = e.Node.NextNode;
        }
        else 
        {
            NextNode = e.Node.Nodes[0]; 
        }
    }
    

    【讨论】:

    • nextNode 或 prevNode 仅返回其兄弟节点...我想要立即下一个和上一个节点...有关更多详细信息,请参阅更新的问题...
    【解决方案3】:

    我偶然发现这个问题有同样的问题,所以这是我对这个问题的解决方案:

    假设 start 是开始的 TreeNode,“向下”

    if (start?.Nodes.Count > 0)
        start = start?.Nodes[0]; //If there are childs, select the first
    else if (start?.NextNode != null)
        start = start?.NextNode; //If there is a sibling, select the sibling
    else
    {
        //In this case, the next node is a sibling of one of the nodes ancestors
        if (start?.Parent?.NextNode != null)
            start = start?.Parent?.NextNode; //the parents sibling is our next node
        else
        {
            //we go the paths along the parents up, until we can go to the next sibling,
            //as long as there exist some parents
            while(start.Level != 0)
            {
                start = start.Parent;
                if (start.NextNode != null)
                {
                    start = start.NextNode;
                    break;
                }
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      在我看来,这段代码完美无缺。 NextVisibleNode - 解决问题

      if (treeView.SelectedNode != null) {
          var currentNode = treeView.SelectedNode;
          while(currentNode.NextVisibleNode != null ) {
              currentNode = currentNode.NextVisibleNode;    
              if (currentNode.Checked) { break; }
          }
          MessageBox.Show("Next checked node is " + currentNode.Text);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-08
        • 2010-11-03
        • 2015-05-14
        相关资源
        最近更新 更多