居然C#的treeview的treeNode没有GetNext获取下一节点

本文介绍了一种在C#中自定义获取TreeView中TreeNode下一节点的算法,包括同级兄弟节点和父节点兄弟节点的逻辑处理,以及如何在视图上找到下一个节点的详细实现。

首先,C#里面的TreeNode有curNode.NextNode获取下一个节点的方法,但前提是获取的兄弟节点(即同级节点),最后一个节点返回的是null。

而我们一般查找TreeView里面的节点后,下一节点一般指视图上的下一个节点,若与当前节点同一级则是取下一个兄弟节点;若是最后1个节点,则需返回母节点的兄弟节点。

居然,网上还没类似的方案,只有自己动手解决了。

解决方案如下:

        public TreeNode GetNextNode(TreeNode curNode)
        {
            if (curNode == null) return null;

            if (curNode.Nodes.Count > 0)
            {
                return curNode.FirstNode; //1.返回自己的子节点优先
            }
            else //2.返回自己的兄弟节点
            {
                if (curNode.NextNode != null)
                {
                    return curNode.NextNode;
                }
                else //3.返回 父节点的兄弟节点
                {
                    while (curNode.Parent != null)
                    {
                        curNode = curNode.Parent;
                        if (curNode.NextNode != null) return curNode.NextNode;
                    }
                }
            }

            return null;
        }

测试:

   private void button1_Click(object sender, EventArgs e)
        {

            treeview1.SelectedNode = GetNextNode(treeview1.SelectedNode);
            if (treeview1.SelectedNode != null)
            {
                treeview1.SelectedNode.BackColor = Color.Red;
            }

        }

 

//把查找下一个的代码也Mark一下,免得下次找不到

      public static bool Contains(string sourceStr, string subStr, StringComparison comp)
        {
            return sourceStr.IndexOf(subStr, comp) >= 0;
        }

        public void FindNextNode(TreeView curTreeView, TreeNode curNode, string strValue)
        {
            if (string.IsNullOrEmpty(strValue))
            {
               // MessageBox.Show("查找内容为空,请重新设置。");
                return;
            }
            curNode = ClsCommon.GetNextNode(curTreeView.SelectedNode);

            // 忽略大小写
            while (curNode != null && !ClsCommon.Contains(curNode.Text, strValue, StringComparison.CurrentCultureIgnoreCase))
            {
                curNode = ClsCommon.GetNextNode(curNode);
            }

            if (curNode != null)
            {
                curTreeView.SelectedNode = curNode;
                curNode.BackColor = Color.YellowGreen; //改变查找的节点背景色showNodes(tn);
                this.Hide();
               // this.Close();
                return;
            }

            MessageBox.Show("没有匹配项。");
        }

 

测试:

     private void btn_next_Click(object sender, EventArgs e)
        {
            FindNextNode(tv_psiSi, tv_psiSi.SelectedNode, findText);
        }

<think>我们正在处理一个关于C# TreeView控件的问题:用户想要获取节点下的所有子节点集合。根据引用内容,我们知道如何添加根节点和子节点,但未直接说明如何获取节点集合。不过,我们可以根据TreeView的属性和方法来推断。 在TreeView中,每个节点TreeNode)都有一个Nodes属性,该属性表示该节点的子节点集合。根节点TreeView的顶级节点,它们位于TreeView的Nodes集合中。因此,要获取节点下的所有子节点,我们需要遍历每个根节点,然后获取每个根节点的Nodes集合。 但是,用户的问题可能有两种理解: 1. 获取所有根节点(顶级节点)下的第级子节点集合(即每个根节点的直接子节点)。 2. 获取所有根节点下的所有子节点(包括嵌套的子节点)。 由于问题描述是“根节点下的子节点集合”,通常指的是第级子节点。不过,为了全面性,我们可以提供两种情况的代码。 根据引用[1]和[2],我们知道: - 根节点是通过treeView1.Nodes.Add()添加的。 - 子节点是通过选中的根节点TreeNode)的Nodes.Add()添加的。 因此,我们可以这样获取: 1. 获取所有根节点treeView1.Nodes 2. 对于每个根节点,其子节点集合就是rootNode.Nodes 如果需要获取所有根节点的第级子节点(即每个根节点的直接子节点)的集合,我们可以遍历treeView1.Nodes,然后对每个根节点访问其Nodes属性。 示例代码: 情况1:获取所有根节点的第级子节点(返回一个包含所有第级子节点的列表) ```csharp List<TreeNode> firstLevelChildren = new List<TreeNode>(); foreach (TreeNode rootNode in treeView1.Nodes) { // 将每个根节点的所有直接子节点添加到列表中 firstLevelChildren.AddRange(rootNode.Nodes.Cast<TreeNode>()); } ``` 情况2:获取所有根节点下的所有子节点(递归获取所有后代节点) ```csharp List<TreeNode> allChildren = new List<TreeNode>(); foreach (TreeNode rootNode in treeView1.Nodes) { // 递归获取该根节点下的所有子节点 GetAllChildren(rootNode, allChildren); } // 递归函数 private void GetAllChildren(TreeNode parentNode, List<TreeNode> allChildren) { foreach (TreeNode child in parentNode.Nodes) { allChildren.Add(child); // 递归调用以获取该子节点的子节点 GetAllChildren(child, allChildren); } } ``` 但是,如果用户只想要一个节点下的子节点(比如选中的根节点),那么可以这样: ```csharp // 获取当前选中的节点(假设为根节点TreeNode selectedNode = treeView1.SelectedNode; if (selectedNode != null) { // 获取该根节点的直接子节点集合 TreeNodeCollection children = selectedNode.Nodes; // 如果需要列表形式 List<TreeNode> childList = children.Cast<TreeNode>().ToList(); } ``` 根据问题描述,用户想要的是“根节点下的子节点集合”,这里我们理解为所有根节点的第级子节点(情况1)或者特定根节点的第级子节点。由于问题没有明确是否所有根节点,我们可以提供两种方式。 注意:如果TreeView有多个根节点,那么情况1的代码会获取所有根节点的第级子节点。如果用户想分别获取每个根节点的子节点,那么可以分别处理每个根节点。 因此,我们提供以下答案:</think>### C# 获取 TreeView节点的所有子节点集合 在 C#TreeView 控件中,获取节点下所有子节点集合的方法如下: ```csharp // 获取所有根节点的第级子节点集合 TreeNodeCollection rootChildren = treeView1.Nodes; // 根节点集合 // 示例1:遍历所有根节点的直接子节点 foreach (TreeNode rootNode in rootChildren) { // 获取当前根节点的子节点集合 TreeNodeCollection children = rootNode.Nodes; // 遍历子节点 foreach (TreeNode child in children) { Console.WriteLine(child.Text); // 输出子节点文本 } } // 示例2:获取特定根节点的子节点集合 if (treeView1.Nodes.Count > 0) { TreeNode firstRoot = treeView1.Nodes[0]; // 获取一个节点 TreeNodeCollection firstRootChildren = firstRoot.Nodes; // 子节点集合 // 转换为列表 List<TreeNode> childNodesList = firstRootChildren.Cast<TreeNode>().ToList(); } ``` #### 关键点说明: 1. **根节点集合**:通过 `treeView1.Nodes` 获取所有根节点 2. **子节点集合**:每个 `TreeNode` 对象的 `Nodes` 属性包含其直接子节点 3. **层级关系**: - 根节点:`treeView1.Nodes[i]` - 子节点:`treeView1.Nodes[i].Nodes[j]` - 孙节点:`treeView1.Nodes[i].Nodes[j].Nodes[k]` #### 完整示例(带界面操作): ```csharp private void btnGetChildren_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); // 遍历所有根节点 foreach (TreeNode root in treeView1.Nodes) { sb.AppendLine($"根节点 [{root.Text}] 的子节点:"); // 遍历当前根节点的子节点 foreach (TreeNode child in root.Nodes) { sb.AppendLine($"-- {child.Text}"); } } MessageBox.Show(sb.ToString()); } ``` #### 注意事项: 1. 当树为空时,`Nodes.Count` 为 0 2. 使用 `Cast<TreeNode>()` 可将 `TreeNodeCollection` 转换为可查询的集合 3. 如需递归获取所有后代节点(包括子节点、孙节点等),需要使用递归遍历[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值