xmltreeview.cs

来自「自己做的一个浏览器~~大家请看看~如果合意给个彩头」· CS 代码 · 共 226 行

CS
226
字号
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Resources;

namespace APLib.Windows.Control
{
	/// <summary>
	/// XML节点树列表类
	/// 将XML文件以树状列表显示出来
	/// </summary>
	public partial class XmlTreeView : TreeView
	{
		/// <summary>
		/// Item节点选中事件
		/// </summary>
		public event EventHandler<XmlTreeViewEventArgs> ItemSelected;
		/// <summary>
		/// Folder节点选中事件
		/// </summary>
		public event EventHandler<XmlTreeViewEventArgs> FolderSelected;

		/// <summary>
		/// 构造函数
		/// </summary>
		public XmlTreeView()
		{
			InitializeComponent();
		}

		private const string folderImageKey = "Folder";
		private const string folderOpenImageKey = "FolderOpen";
		private const string itemImageKey = "Item";

		private bool IsFolder(XmlNode node)
		{
			return node.Name.Equals("folder", StringComparison.InvariantCultureIgnoreCase);
		}

		#region Attach Node

		/// <summary>
		/// 创建子节点
		/// </summary>
		/// <param name="treeNode">父节点</param>
		private void Attach(TreeNode treeNode)
		{
			XmlNode node = treeNode.Tag as XmlNode;
				foreach (XmlNode child in node.ChildNodes)
				{
					TreeNode treeChild = treeNode.Nodes.Add(child.Attributes["name"].Value);
					treeChild.Tag = child;
					if (IsFolder(child))
					{
						treeChild.ImageKey = folderImageKey;
						Attach(treeChild);
					}
					else
					{
						treeChild.ImageKey = itemImageKey;
					}
				}
		}
		/// <summary>
		/// 创建根节点
		/// </summary>
		/// <param name="doc">XML文档对象</param>
		private void AttachRoot(XmlDocument doc)
		{
			try
			{
				TreeNode root = this.Nodes.Add(doc.DocumentElement.Attributes["name"].Value);
				root.Tag = doc.DocumentElement;
				Attach(root);
			}
			catch
			{
				throw new Exception("XmlTree file error");
			}
		}

		#endregion

		#region CheckDuplicate

		private bool CheckDuplicate(TreeNode node, string name)
		{
			bool dup = false;
			TreeNode sibling = node.PrevNode;
			while (sibling != null)
			{
				if (sibling.Text.Equals(name))
				{
					dup = true;
					break;
				}
				sibling = node.PrevNode;
			}
			if (!dup)
			{
				sibling = node.NextNode;
				while (sibling != null)
				{
					if (sibling.Text.Equals(name))
					{
						dup = true;
						break;
					}
					sibling = node.NextNode;
				}
			}
			return dup;
		}

		private bool CheckDuplicate(XmlNode node, string name)
		{
			bool dup = false;
			XmlNode sibling = node.PreviousSibling;
			while (sibling != null)
			{
				if (sibling.Attributes["name"].Value.Equals(name))
				{
					dup = true;
					break;
				}
				sibling = node.PreviousSibling;
			}
			if (!dup)
			{
				sibling = node.NextSibling;
				while (sibling != null)
				{
					if (sibling.Attributes["name"].Value.Equals(name))
					{
						dup = true;
						break;
					}
					sibling = node.NextSibling;
				}
			}
			return dup;
		}

		#endregion

		/// <summary>
		/// 加载XML文本
		/// </summary>
		/// <param name="xml">XML文本</param>
		public void LoadXml(string xml)
		{
			XmlDocument doc = new XmlDocument();
			doc.LoadXml(xml);
			AttachRoot(doc);
		}
		/// <summary>
		/// 加载XML文件
		/// </summary>
		/// <param name="file">XML文件路径</param>
		public void Load(string file)
		{
			XmlDocument doc = new XmlDocument();
			doc.Load(file);
			AttachRoot(doc);
		}

		#region 重载事件

		protected override void OnAfterLabelEdit(NodeLabelEditEventArgs e)
		{
			base.OnAfterLabelEdit(e);
			if (!CheckDuplicate(e.Node, e.Label))
			{
				XmlNode node = e.Node.Tag as XmlNode;
				node.Attributes["name"].Value = e.Label;
			}
			else
			{
				e.CancelEdit = true;
				MsgBox.ShowError(this.GetType(), "strDuplicateName", "strError");
			}
		}

		protected override void OnAfterCollapse(TreeViewEventArgs e)
		{
			base.OnAfterCollapse(e);
			if (IsFolder(e.Node.Tag as XmlNode))
				e.Node.ImageKey = folderImageKey;
			else
				e.Node.ImageKey = itemImageKey;
		}

		protected override void OnAfterExpand(TreeViewEventArgs e)
		{
			base.OnAfterExpand(e);
			if (IsFolder(e.Node.Tag as XmlNode))
				e.Node.ImageKey = folderOpenImageKey;
			else
				e.Node.ImageKey = itemImageKey;
		}

		protected override void OnAfterSelect(TreeViewEventArgs e)
		{
			base.OnAfterSelect(e);
			XmlNode node = e.Node.Tag as XmlNode;
			if (IsFolder(node))
			{
				if (FolderSelected != null)
					FolderSelected(this, new XmlTreeViewEventArgs(node));
			}
			else
			{
				if (ItemSelected != null)
					ItemSelected(this, new XmlTreeViewEventArgs(node));
			}
		}

		#endregion
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?