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日

悬赏问题

  • ¥15 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢