temz 2023-03-31 12:02 采纳率: 100%
浏览 52
已结题

TreeView中TreeNode.Tag问题

在winform中做了一个TreeView,节点数据存在XML文件里面,现在想用TreeNode节点属性Tag存储些数据,于是将Dictionary<string,string>对象赋给了treenode.tag,节点级别从高到底依次是root,area,user,lowest,从XML中读出文件的时候节点级别读出都没问题
这是从xml读出文件获取TreeView节点的代码

 private void XmlNode2TreeNode(XmlNodeList xmlNode, TreeNodeCollection treeNode)
        {
            foreach (XmlNode xmlnode in xmlNode)
            {
                if (xmlnode.NodeType != XmlNodeType.Element)    //忽略非Element类型的节点
                {
                    continue;
                }
                TreeNode treenode = new TreeNode();      //新建一个TreeNode,并根据XML节点的Title属性设置文本
                treenode.Text = xmlnode.Attributes["Title"].Value;
               
                if (xmlnode.HasChildNodes)                       //如果XML节点有子节点,则递归调用XmlNode2TreeNode方法转换子节点
                {
                    if (xmlnode.ChildNodes[0].NodeType == XmlNodeType.CDATA)  //如果第一个子节点是CDATA,则将其内容作为TreeNode的Tag
                    {
                        dict["tag"] = xmlnode.ChildNodes[0].Value;
                        treenode.Tag = dict;

                        if (dict["tag"].Equals("root"))
                        {
                            treenode.ImageIndex = 0;
                            treenode.SelectedImageIndex = 0;
                        }
                        else if (dict["tag"].Equals("area"))
                        {
                            treenode.ImageIndex = 1;
                            treenode.SelectedImageIndex = 1;
                        }
                        else if (dict["tag"].Equals("user"))
                        {
                            treenode.ImageIndex = 2;
                            treenode.SelectedImageIndex = 2;
                        }
                        else if (dict["tag"].Equals("lowest"))
                        {
                            treenode.ImageIndex = 2;
                            treenode.SelectedImageIndex = 2;
                        }

                    }
                    //将新建的TreeNode添加到父TreeNode的Nodes 集合中
                    XmlNode2TreeNode(xmlnode.ChildNodes, treenode.Nodes);
                }
                //将新建的TreeNode添加到TreeView的节点集合中
                treeNode.Add(treenode);
            }
        }

这是运行的样子

img

下面是鼠标事件的代码

private void treeView1_MouseUp(object sender, MouseEventArgs e)
        {

            try
            {
                Point mpt = new Point(e.X, e.Y);
                TreeNode TreeClickNode = this.treeView1.GetNodeAt(mpt);

                if (TreeClickNode != null)
                {
                    dict = (Dictionary<string, string>)TreeClickNode.Tag;
                    CreatMenu(dict["tag"]);          //    dict["tag"]里面是node的级别(root,area,user,lowest)
                    //CreatMenu(TreeClickNode1.Tag.ToString());
                    if (e.Button == MouseButtons.Right)
                    {
                        this.contextMenuStrip.Show(this.treeView1, mpt);       //在mpt位置实现treeview1的点击菜单栏
                        //this.treeView1.ContextMenu.Show(treeView1,mpt);
                    }
                }
                else
                {
                     contextMenuStrip.Items.Clear();
                }
            }
            catch
            { 
            
            }
        }

现在右键点击显示菜单的时候一般都只能得到级别都是user,右键点击菜单里面有添加最低一层节点,在添加最低一层节点后点击事件就只能获取到lowset这个级别了,应该是xml读取的地方出问题了但是又找不到是哪里。
如果不将Dictionary<string,string>赋给TreeNode.tag,而只是用下面的代码,则在点击事件中获取级别没有问题,但是没有Dictionary类型储存数据了,请对这方面熟悉的老兄给解决下吧

private void XmlNode2TreeNode(XmlNodeList xmlNode, TreeNodeCollection treeNode)
        {
            foreach (XmlNode xmlnode in xmlNode)
            {
                if (xmlnode.NodeType != XmlNodeType.Element)    //忽略非Element类型的节点
                {
                    continue;
                }
                TreeNode treenode = new TreeNode();      //新建一个TreeNode,并根据XML节点的Title属性设置文本
                treenode.Text = xmlnode.Attributes["Title"].Value;

                if (xmlnode.HasChildNodes)                       //如果XML节点有子节点,则递归调用XmlNode2TreeNode方法转换子节点
                {
                    if (xmlnode.ChildNodes[0].NodeType == XmlNodeType.CDATA)  //如果第一个子节点是CDATA,则将其内容作为TreeNode的Tag
                    {
                        treenode.Tag = xmlnode.ChildNodes[0].Value;  
                        if (treenode.Tag.ToString().Equals("root"))
                        {
                            treenode.ImageIndex = 0;
                            treenode.SelectedImageIndex = 0;
                            treenode.Expand();
                        }
                        else if (treenode.Tag.ToString().Equals("area"))
                        {
                            treenode.ImageIndex = 1;
                            treenode.SelectedImageIndex = 1;
                           
                        }
                        else if (treenode.Tag.ToString().Equals("user"))
                        {
                            treenode.ImageIndex = 2;
                            treenode.SelectedImageIndex = 2;
                        }
                        else
                        {
                            treenode.ImageIndex = 2;
                            treenode.SelectedImageIndex = 2;
                        }

                    }
                    //将新建的TreeNode添加到父TreeNode的Nodes 集合中
                    XmlNode2TreeNode(xmlnode.ChildNodes, treenode.Nodes);
                }
                //将新建的TreeNode添加到TreeView的节点集合中
                treeNode.Add(treenode);
            }
        }

  • 写回答

7条回答 默认 最新

  • 社区专家-Monster-XH 2023-03-31 12:08
    关注

    基于Monster 组和GPT的调写:

    • 问题可能是在XmlNode2TreeNode方法中设置TreeNode的Tag属性时,用了同一个Dictionary实例来保存不同的节点信息。在这个方法中,每个TreeNode都应该有自己的Dictionary实例来保存节点信息。所以,可以在每个循环迭代中,新建一个Dictionary实例,将节点信息存储在其中,然后将这个Dictionary实例赋给TreeNode的Tag属性。

    修改后的代码如下:

    private void XmlNode2TreeNode(XmlNodeList xmlNode, TreeNodeCollection treeNode)
    {
        foreach (XmlNode xmlnode in xmlNode)
        {
            if (xmlnode.NodeType != XmlNodeType.Element)    //忽略非Element类型的节点
            {
                continue;
            }
            TreeNode treenode = new TreeNode();      //新建一个TreeNode,并根据XML节点的Title属性设置文本
            treenode.Text = xmlnode.Attributes["Title"].Value;
    
            if (xmlnode.HasChildNodes)                       //如果XML节点有子节点,则递归调用XmlNode2TreeNode方法转换子节点
            {
                if (xmlnode.ChildNodes[0].NodeType == XmlNodeType.CDATA)  //如果第一个子节点是CDATA,则将其内容作为TreeNode的Tag
                {
                    Dictionary<string, string> dict = new Dictionary<string, string>();
                    dict["tag"] = xmlnode.ChildNodes[0].Value;
                    treenode.Tag = dict;
    
                    if (dict["tag"].Equals("root"))
                    {
                        treenode.ImageIndex = 0;
                        treenode.SelectedImageIndex = 0;
                    }
                    else if (dict["tag"].Equals("area"))
                    {
                        treenode.ImageIndex = 1;
                        treenode.SelectedImageIndex = 1;
                    }
                    else if (dict["tag"].Equals("user"))
                    {
                        treenode.ImageIndex = 2;
                        treenode.SelectedImageIndex = 2;
                    }
                    else if (dict["tag"].Equals("lowest"))
                    {
                        treenode.ImageIndex = 2;
                        treenode.SelectedImageIndex = 2;
                    }
    
                }
                //将新建的TreeNode添加到父TreeNode的Nodes 集合中
                XmlNode2TreeNode(xmlnode.ChildNodes, treenode.Nodes);
            }
            //将新建的TreeNode添加到TreeView的节点集合中
            treeNode.Add(treenode);
        }
    }
    
    
    

    这样就可以在鼠标事件中正确获取节点的级别了,同时也保留了使用Dictionary实例来存储节点信息的功能。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效