temz 2023-03-31 21:32 采纳率: 100%
浏览 34
已结题

TreeView节点查重和添加出问题

C#winform使用TreeView,每次添加节点前对节点进行查重--有重复的节点就跳框显示(使用messagebox.show()),但总是出错误,会出现明明没有该节点却报有重复导致不能添加节点,但是这个问题不是每次都出现,偶尔会出现,试验了一下,就是查重方法的递归调用出的问题,把递归调用注释掉就不出错了,但是没递归调用又没法查重,请给解决下,要求能正常查重并添加节点。
下面是查重方法的代码

private void Check(TreeNodeCollection treeNodes)   //检查Tree View控件中是否已经存在指定用户的节点
        {
            tmpBool = false;
            foreach (TreeNode treeNode in treeNodes)
            {       
                     //unit,user,lowest是由form输入的值,一次只能输入三个中的一个
                    if (treeNode.Text.Equals(unit)|| treeNode.Text.Equals(user)|| treeNode.Text.Equals(lowest))
                    {
                        treeNode.BackColor = Color.Red;    //将节点的背景颜色设为红色
                        treeNode.Parent.Expand();          //展开父节点
                        repeatable = true;                   //设置repeatable为true,表示在三级节点中找到了该用户
                    }

                if (treeNode.Nodes.Count > 0)
                {
                    Check(treeNode.Nodes);             //递归调用CheckUser,查找子节点中是否存在该用户
                }
            }
        }

添加节点的代码:
添加最上级节点

  private void AddArea_Click(object sender, EventArgs e)
        {
            //创建AddUser窗体的实例
            AddUnit form = new AddUnit(this);
            //显示窗体,等待用户输入
            //  if (form.ShowDialog()== DialogResult.OK)
            form.ShowDialog();
                if (!string.IsNullOrEmpty(unit))
                {
                    //检查Tree View控件中是否已经存在指定用户的节点
                    Check(this.treeView1.Nodes);
                    if (repeatable)
                    {
                    //如果用户已经存在,弹出确认对话框
                    MessageBox.Show("[" + unit + "]已经存在");
                     
                    }
                    else
                    {   //如果用户不存在,创建新的节点
                        TreeNode node = CreateRootNode();
                        //TreeNode selectNode = this.treeView1.SelectedNode;
                        //selectNode.Nodes.Add(node);    //adduser
                        this.treeView1.Nodes[0].Nodes.Add(node);
                        SaveToXml();     //重新从XML文件中加载数据并更新Tree View控件
                        LoadFormXml();

                    }

                }
          //  }
            repeatable = false;    //重置repeatable
        }

添加二级节点

private void AddUser_Click(object sender, EventArgs e)
        {
            //创建AddUser窗体的实例
            AddUser form = new AddUser(this);
            //显示窗体,等待用户输入
            if (form.ShowDialog() == DialogResult.OK)
            {
                if (!string.IsNullOrEmpty(user))
                {
                    //检查Tree View控件中是否已经存在指定用户的节点
                    Check(this.treeView1.Nodes);
                    if (repeatable)
                    {
                        //如果用户已经存在,弹出确认对话框
                        MessageBox.Show("[" + user + "]已经存在");
                       
                    }
                    else
                    {   //如果用户不存在,创建新的节点
                        TreeNode node = CreateChildNode();
                        TreeNode selectNode = this.treeView1.SelectedNode;
                        selectNode.Nodes.Add(node);
                        SaveToXml();     //重新从XML文件中加载数据并更新Tree View控件
                        LoadFormXml();

                    }

                }
            }
            repeatable = false;   //重置repeatable
        }

添加三级节点

private void AddLowest_Click(object sender, EventArgs e)
        {
            //创建AddUser窗体的实例
            AddLowest form = new AddLowest(this);
            //显示窗体,等待用户输入
            if (form.ShowDialog() == DialogResult.OK)
            {
                if (!string.IsNullOrEmpty(lowest))
                {
                    //检查Tree View控件中是否已经存在指定用户的节点
                    Check(this.treeView1.Nodes);
                    if (repeatable)
                    {
                       
                            //如果用户已经存在,弹出确认对话框
                            MessageBox.Show("[" + lowest + "]已经存在");

                    }
                    else
                    {   //如果用户不存在,创建新的节点
                        TreeNode node = CreateLowestNode();
                        TreeNode selectNode = this.treeView1.SelectedNode;
                        selectNode.Nodes.Add(node);    //adduser
                        SaveToXml();     //重新从XML文件中加载数据并更新Tree View控件
                        LoadFormXml();

                    }
                   
                }
            }
            repeatable = false;    //重置repeatable
        }

  • 写回答

4条回答 默认 最新

  • 社区专家-Monster-XH 2023-03-31 21:36
    关注

    基于Monster 组和GPT的调写:
    可能出现问题的地方在于递归调用Check()方法时,没有正确处理重复节点的情况。当递归查找到重复节点时,应该立即停止递归,而不是继续查找。

    修改后的Check()方法代码:

    private bool Check(TreeNodeCollection treeNodes, string text)
    {
        foreach (TreeNode treeNode in treeNodes)
        {
            if (treeNode.Text.Equals(text))
            {
                treeNode.BackColor = Color.Red;
                treeNode.Parent.Expand();
                return true; // 找到重复节点,停止递归
            }
    
            if (treeNode.Nodes.Count > 0)
            {
                bool isDuplicate = Check(treeNode.Nodes, text); // 传递isDuplicate到子节点
                if (isDuplicate)
                {
                    return true; // 子节点中找到重复节点,停止递归
                }
            }
        }
    
        return false; // 没有找到重复节点
    }
    
    
    

    修改后的添加节点的代码:

    private void AddArea_Click(object sender, EventArgs e)
    {
        // ...
    
        if (!string.IsNullOrEmpty(unit))
        {
            bool isDuplicate = Check(this.treeView1.Nodes, unit);
            if (isDuplicate)
            {
                // 如果存在重复节点,直接返回
                return;
            }
    
            // 创建新的节点
            TreeNode node = CreateRootNode();
            this.treeView1.Nodes[0].Nodes.Add(node);
            SaveToXml();
            LoadFormXml();
        }
    
        // ...
    }
    
    private void AddUser_Click(object sender, EventArgs e)
    {
        // ...
    
        if (!string.IsNullOrEmpty(user))
        {
            bool isDuplicate = Check(this.treeView1.Nodes, user);
            if (isDuplicate)
            {
                // 如果存在重复节点,直接返回
                return;
            }
    
            // 创建新的节点
            TreeNode node = CreateChildNode();
            TreeNode selectNode = this.treeView1.SelectedNode;
            selectNode.Nodes.Add(node);
            SaveToXml();
            LoadFormXml();
        }
    
        // ...
    }
    
    private void AddLowest_Click(object sender, EventArgs e)
    {
        // ...
    
        if (!string.IsNullOrEmpty(lowest))
        {
            bool isDuplicate = Check(this.treeView1.Nodes, lowest);
            if (isDuplicate)
            {
                // 如果存在重复节点,直接返回
                return;
            }
    
            // 创建新的节点
            TreeNode node = CreateLowestNode();
            TreeNode selectNode = this.treeView1.SelectedNode;
            selectNode.Nodes.Add(node);
            SaveToXml();
            LoadFormXml();
        }
    
        // ...
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月9日
  • 已采纳回答 4月1日
  • 创建了问题 3月31日

悬赏问题

  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题