You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

225 lines
8.5 KiB
C#

1 year ago
using System;
using System.Collections.Generic;
using System.Xml;
using System.Text;
using System.Windows.Forms;
namespace Mesnac.Basic
{
/// <summary>
/// TreeView扩展方法类 基于.NetFramework3.5及以上版本
/// </summary>
public static class TreeViewHelper
{
#region TreeView扩展方法
/// <summary>
/// TreeView的扩展方法把工程树节点的内容保存到工程文件中
/// </summary>
/// <param name="tv">TreeView对象</param>
/// <param name="filePath">要保存的工程文件完整路径</param>
public static void SaveToXml(this TreeView tv, string filePath)
{
XmlDocument doc = new XmlDocument();
XmlElement eroot = doc.CreateElement("MesnacPrj");
foreach (TreeNode n in tv.Nodes)
{
XmlElement en = doc.CreateElement("Node");
//XmlAttribute aId = doc.CreateAttribute("Id");
XmlAttribute aName = doc.CreateAttribute("Name");
XmlAttribute aText = doc.CreateAttribute("Text");
XmlAttribute aToolTipText = doc.CreateAttribute("ToolTipText");
XmlAttribute aTag = doc.CreateAttribute("Tag");
XmlAttribute aImageIndex = doc.CreateAttribute("ImageIndex");
XmlAttribute aSelectedImageIndex = doc.CreateAttribute("SelectedImageIndex");
//aId.Value = n.Index.ToString();
aName.Value = n.Name;
aText.Value = n.Text;
aToolTipText.Value = n.ToolTipText;
aTag.Value = n.Tag.ToString();
aImageIndex.Value = n.ImageIndex.ToString();
aSelectedImageIndex.Value = n.SelectedImageIndex.ToString();
//en.Attributes.Append(aId);
en.Attributes.Append(aName);
en.Attributes.Append(aText);
en.Attributes.Append(aToolTipText);
en.Attributes.Append(aTag);
en.Attributes.Append(aImageIndex);
en.Attributes.Append(aSelectedImageIndex);
ToXmlElement(doc, en, n);
eroot.AppendChild(en);
}
doc.AppendChild(eroot);
doc.Save(filePath);
}
/// <summary>
/// 递归解析工程数据节点
/// </summary>
/// <param name="doc"></param>
/// <param name="e"></param>
/// <param name="tn"></param>
private static void ToXmlElement(XmlDocument doc, XmlElement e, TreeNode tn)
{
foreach (TreeNode n in tn.Nodes)
{
XmlElement en = doc.CreateElement("Node");
//XmlAttribute aId = doc.CreateAttribute("Id");
XmlAttribute aName = doc.CreateAttribute("Name");
XmlAttribute aText = doc.CreateAttribute("Text");
XmlAttribute aToolTipText = doc.CreateAttribute("ToolTipText");
XmlAttribute aTag = doc.CreateAttribute("Tag");
XmlAttribute aImageIndex = doc.CreateAttribute("ImageIndex");
XmlAttribute aSelectedImageIndex = doc.CreateAttribute("SelectedImageIndex");
//aId.Value = n.Index.ToString();
aName.Value = n.Name;
aText.Value = n.Text;
aToolTipText.Value = n.ToolTipText;
aTag.Value = n.Tag == null ? String.Empty : n.Tag.ToString();
aImageIndex.Value = n.ImageIndex.ToString();
aSelectedImageIndex.Value = n.SelectedImageIndex.ToString();
//en.Attributes.Append(aId);
en.Attributes.Append(aName);
en.Attributes.Append(aText);
en.Attributes.Append(aToolTipText);
en.Attributes.Append(aTag);
en.Attributes.Append(aImageIndex);
en.Attributes.Append(aSelectedImageIndex);
e.AppendChild(en);
ToXmlElement(doc, en, n);
}
}
/// <summary>
/// 通过载入工程文件,构建工程树
/// </summary>
/// <param name="tv"></param>
/// <param name="filePath">工程文件的完整路径</param>
public static void LoadFromXml(this TreeView tv, string filePath)
{
tv.Nodes.Clear();
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XmlElement eroot = doc.DocumentElement;
List<TreeNode> nodes = new List<TreeNode>();
if (eroot.HasChildNodes)
{
foreach (XmlNode xn in eroot.ChildNodes)
{
TreeNode tn = new TreeNode();
tn.Name = xn.Attributes["Name"].Value;
tn.Text = xn.Attributes["Text"].Value;
tn.ToolTipText = xn.Attributes["ToolTipText"].Value;
tn.Tag = xn.Attributes["Tag"].Value;
tn.ImageIndex = Convert.ToInt32(xn.Attributes["ImageIndex"].Value);
tn.SelectedImageIndex = Convert.ToInt32(xn.Attributes["SelectedImageIndex"].Value);
ToTreeNode(xn, tn);
nodes.Add(tn);
}
}
tv.Nodes.AddRange(nodes.ToArray());
tv.ExpandAll();
}
/// <summary>
/// 递归解析工程文件节点
/// </summary>
/// <param name="xn"></param>
/// <param name="tn"></param>
private static void ToTreeNode(XmlNode xn, TreeNode tn)
{
if (xn.HasChildNodes)
{
foreach (XmlNode xxn in xn.ChildNodes)
{
TreeNode ttn = new TreeNode();
ttn.Name = xxn.Attributes["Name"].Value;
ttn.Text = xxn.Attributes["Text"].Value;
ttn.ToolTipText = xxn.Attributes["ToolTipText"].Value;
ttn.Tag = xxn.Attributes["Tag"].Value;
ttn.ImageIndex = Convert.ToInt32(xxn.Attributes["ImageIndex"].Value);
ttn.SelectedImageIndex = Convert.ToInt32(xxn.Attributes["SelectedImageIndex"].Value);
ToTreeNode(xxn, ttn);
tn.Nodes.Add(ttn);
}
}
}
/// <summary>
/// TreeView扩展方法获取某个节点(按NodeName搜索的第一个节点)的子节点集合
/// </summary>
/// <param name="tv"></param>
/// <param name="nodeName">节点名称</param>
/// <returns>返回子节点集合</returns>
public static TreeNodeCollection GetChildNodesByNodeName(this TreeView tv, string nodeName)
{
TreeNode[] nodes = tv.Nodes.Find(nodeName, true);
if (nodes != null && nodes.Length > 0)
{
return nodes[0].Nodes;
}
return null;
}
/// <summary>
/// 根据节点名称获取节点
/// </summary>
/// <param name="tv"></param>
/// <param name="nodeName">节点名称</param>
/// <returns>返回对应的节点</returns>
public static TreeNode GetFirstNodeByNodeName(this TreeView tv, string nodeName)
{
if (tv != null)
{
TreeNode[] nodes = tv.Nodes.Find(nodeName, true);
if (nodeName != null && nodes.Length > 0)
{
return nodes[0];
}
}
return null;
}
#endregion
#region TreeNode扩展方法
/// <summary>
/// TreeNode扩展方法 获取此节点的Tag路径
/// </summary>
/// <param name="tn"></param>
/// <returns></returns>
public static string GetPathNoRoot(this TreeNode tn)
{
return GetPath(tn);
}
/// <summary>
/// 递归获取节点Tag属性的串联
/// </summary>
/// <param name="tn"></param>
/// <returns></returns>
private static string GetPath(TreeNode tn)
{
if (tn != null && tn.Parent != null)
{
if (tn.Parent.Parent != null)
{
return GetPath(tn.Parent) + @"\" + tn.Tag.ToString();
}
else
{
return tn.Tag.ToString();
}
}
else
{
return String.Empty;
}
}
#endregion
}
}