在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);
}
}
这是运行的样子
下面是鼠标事件的代码
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);
}
}