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 + -
显示快捷键?