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日

悬赏问题

  • ¥30 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目
  • ¥15 数电几道习题,写出作答过程,ai一律不采用
  • ¥15 利用pthon计算薄膜结构的光导纳
  • ¥15 海康hlss视频流怎么播放
  • ¥15 Paddleocr:out of memory error on GPU
  • ¥30 51单片机C语言数码管驱动单片机为AT89C52