实现功能有
1.根据Xml生成TreeView
2.双击修改节点
3.右键添加子节点或添加要节点
4.右键删除当前选择的节点
5.将修改后的TreeView重新生成Xml文档

其实这个主要是实现 了Xml生成TreeView,然后再根据TreeView生成Xml的过程
对我们操作这方面实现有很大的帮助
下面一起来看看我的界面吧

 
下面咱们一步一步来实现一下吧,
先来看看我的Xml文档结构

<?xml version="1.0" encoding="UTF-8"?>
<Tree>
<Node Name="" Text="去查网" >
<Node Name="" Text="技术部" ></Node>
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="cckan" >
<Node Name="" Text="开发部" ></Node>
</Node>
<Node Name="" Text="51.la" >
<Node Name="" Text="销售部fdf" >
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" >
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点fdf" ></Node>
<Node Name="" Text="新建子节点fdfd" ></Node>
</Node>
</Node>
<Node Name="" Text="操作部fdf" >
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="客服部fdf" ></Node>
<Node Name="" Text="财务部" ></Node>
</Node>
<Node Name="" Text="新建根节点" >
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="新建根节点" >
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="新建根节点" ></Node>
</Tree>

很简单吧,
下面来看看是怎么生成TreeView的

XmlDocument doc = new XmlDocument();
StringBuilder sb = new StringBuilder();
//XML每行的内容
private string xmlLine = "";
//加载
private void Form1_Load(object sender, EventArgs e)
{
doc.Load("TreeXml.xml"); //我是把xml放到debug里面了.你的路径就随便啦.不过这样方便一些.
RecursionTreeControl(doc.DocumentElement, treeView1.Nodes);//将加载完成的XML文件显示在TreeView控件中
treeView1.ExpandAll();//展开TreeView控件中的所有项
}
/// <summary>
/// RecursionTreeControl:表示将XML文件的内容显示在TreeView控件中
/// </summary>
/// <param name="xmlNode">将要加载的XML文件中的节点元素</param>
/// <param name="nodes">将要加载的XML文件中的节点集合</param>
private void RecursionTreeControl(XmlNode xmlNode, TreeNodeCollection nodes)
{
foreach (XmlNode node in xmlNode.ChildNodes)//循环遍历当前元素的子元素集合
{
TreeNode new_child = new TreeNode();//定义一个TreeNode节点对象
new_child.Name = node.Attributes["Name"].Value;
new_child.Text = node.Attributes["Text"].Value;
nodes.Add(new_child);//向当前TreeNodeCollection集合中添加当前节点
RecursionTreeControl(node, new_child.Nodes);//调用本方法进行递归
}
}

用的是一个递归的方式生成的,
大家看看就明白了
下面是删除,修改和添加节点的代码

//双击时修改
private void treeView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point ClickPoint = new Point(e.X, e.Y);
TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
if (CurrentNode != null)//判断你点的是不是一个节点
{
treeView1.SelectedNode = CurrentNode;//选中这个节点
treeView1.LabelEdit = true;
treeView1.SelectedNode.BeginEdit();
}
}
}
//添加节点
private void addTreeNode_Click(object sender, EventArgs e)
{
try
{
treeView1.SelectedNode.Nodes.Add("新建子节点");
toolStripStatusLabel1.Text = "新建子节点";
}
catch (Exception ex)
{
toolStripStatusLabel1.Text = ex.Message;
}
}
//删除节点
private void deleteTreeNode_Click(object sender, EventArgs e)
{
try
{
treeView1.SelectedNode.Remove();
}
catch (Exception ex)
{ toolStripStatusLabel1.Text = ex.Message;
}
}
//新建根节点
private void addRootTreeNode_Click(object sender, EventArgs e)
{
try
{
treeView1.Nodes.Add("新建根节点");
toolStripStatusLabel1.Text = "新建根节点成功";
}
catch (Exception ex)
{
toolStripStatusLabel1.Text = ex.Message;
}
}

下面就是把修改和删除之后的TreeView重新保存成Xml文档了
一起来看看代码吧

//保存
private void SaveXml_Click(object sender, EventArgs e)
{
try
{ //写文件头部内容
//下面是生成RSS的OPML文件
sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.Append("<Tree>"); //遍历根节点
foreach (TreeNode node in treeView1.Nodes)
{
xmlLine = GetRSSText(node);
sb.Append(xmlLine); //递归遍历节点
parseNode(node, sb); sb.Append("</Node>");
}
sb.Append("</Tree>"); StreamWriter sr = new StreamWriter("TreeXml.xml", false, System.Text.Encoding.UTF8);
sr.Write(sb.ToString());
sr.Close();
toolStripStatusLabel1.Text = "保存成功";
}
catch (Exception ex)
{
toolStripStatusLabel1.Text = ex.Message;
}
}
//递归遍历节点内容,最关键的函数
private void parseNode(TreeNode tn, StringBuilder sb)
{
IEnumerator ie = tn.Nodes.GetEnumerator(); while (ie.MoveNext())
{
TreeNode ctn = (TreeNode)ie.Current;
xmlLine = GetRSSText(ctn);
sb.Append(xmlLine);
//如果还有子节点则继续遍历
if (ctn.Nodes.Count > )
{
parseNode(ctn, sb);
}
sb.Append("</Node>");
}
}
//成生RSS节点的XML文本行
private string GetRSSText(TreeNode node)
{
//根据Node属性生成XML文本
string rssText = "<Node Name=\"" + node.Name + "\" Text=\"" + node.Text + "\" >"; return rssText;
}

好了全部代码贴一下大家看看吧

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Collections;
using System.IO; namespace TreeLoadXml
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
XmlDocument doc = new XmlDocument();
StringBuilder sb = new StringBuilder();
//XML每行的内容
private string xmlLine = "";
//加载
private void Form1_Load(object sender, EventArgs e)
{
doc.Load("TreeXml.xml"); //我是把xml放到debug里面了.你的路径就随便啦.不过这样方便一些.
RecursionTreeControl(doc.DocumentElement, treeView1.Nodes);//将加载完成的XML文件显示在TreeView控件中
treeView1.ExpandAll();//展开TreeView控件中的所有项
}
/// <summary>
/// RecursionTreeControl:表示将XML文件的内容显示在TreeView控件中
/// </summary>
/// <param name="xmlNode">将要加载的XML文件中的节点元素</param>
/// <param name="nodes">将要加载的XML文件中的节点集合</param>
private void RecursionTreeControl(XmlNode xmlNode, TreeNodeCollection nodes)
{
foreach (XmlNode node in xmlNode.ChildNodes)//循环遍历当前元素的子元素集合
{
TreeNode new_child = new TreeNode();//定义一个TreeNode节点对象
new_child.Name = node.Attributes["Name"].Value;
new_child.Text = node.Attributes["Text"].Value;
nodes.Add(new_child);//向当前TreeNodeCollection集合中添加当前节点
RecursionTreeControl(node, new_child.Nodes);//调用本方法进行递归
}
}
//双击时修改
private void treeView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point ClickPoint = new Point(e.X, e.Y);
TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
if (CurrentNode != null)//判断你点的是不是一个节点
{
treeView1.SelectedNode = CurrentNode;//选中这个节点
treeView1.LabelEdit = true;
treeView1.SelectedNode.BeginEdit();
}
}
} //递归遍历节点内容,最关键的函数
private void parseNode(TreeNode tn, StringBuilder sb)
{
IEnumerator ie = tn.Nodes.GetEnumerator(); while (ie.MoveNext())
{
TreeNode ctn = (TreeNode)ie.Current;
xmlLine = GetRSSText(ctn);
sb.Append(xmlLine);
//如果还有子节点则继续遍历
if (ctn.Nodes.Count > )
{
parseNode(ctn, sb);
}
sb.Append("</Node>");
} }
//成生RSS节点的XML文本行
private string GetRSSText(TreeNode node)
{
//根据Node属性生成XML文本
string rssText = "<Node Name=\"" + node.Name + "\" Text=\"" + node.Text + "\" >"; return rssText;
} //添加节点
private void addTreeNode_Click(object sender, EventArgs e)
{
try
{
treeView1.SelectedNode.Nodes.Add("新建子节点");
toolStripStatusLabel1.Text = "新建子节点";
}
catch (Exception ex)
{
toolStripStatusLabel1.Text = ex.Message;
}
}
//删除节点
private void deleteTreeNode_Click(object sender, EventArgs e)
{
try
{
treeView1.SelectedNode.Remove();
}
catch (Exception ex)
{ toolStripStatusLabel1.Text = ex.Message;
}
} private void addRootTreeNode_Click(object sender, EventArgs e)
{
try
{
treeView1.Nodes.Add("新建根节点");
toolStripStatusLabel1.Text = "新建根节点成功";
}
catch (Exception ex)
{
toolStripStatusLabel1.Text = ex.Message;
}
}
//保存
private void SaveXml_Click(object sender, EventArgs e)
{
try
{ //写文件头部内容
//下面是生成RSS的OPML文件
sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.Append("<Tree>"); //遍历根节点
foreach (TreeNode node in treeView1.Nodes)
{
xmlLine = GetRSSText(node);
sb.Append(xmlLine); //递归遍历节点
parseNode(node, sb); sb.Append("</Node>");
}
sb.Append("</Tree>"); StreamWriter sr = new StreamWriter("TreeXml.xml", false, System.Text.Encoding.UTF8);
sr.Write(sb.ToString());
sr.Close();
toolStripStatusLabel1.Text = "保存成功";
}
catch (Exception ex)
{
toolStripStatusLabel1.Text = ex.Message;
}
}
}
}

对于生成树的部分其实还有一种Linq的实现方式如下

private void SaveToXml()
{
XDeclaration dec = new XDeclaration("1.0", "utf-8", "yes");
XDocument xml = new XDocument(dec); XElement root = new XElement("Tree"); foreach (TreeNode node in treeView1.Nodes)
{
XElement e = CreateElements(node);
root.Add(e);
}
xml.Add(root);
xml.Save("TreeXml.xml");
} private XElement CreateElements(TreeNode node)
{
XElement root = CreateElement(node); foreach (TreeNode n in node.Nodes)
{
XElement e = CreateElements(n);
root.Add(e);
}
return root;
} private XElement CreateElement(TreeNode node)
{
return new XElement("Node",
new XAttribute("Name", node.Name),
new XAttribute("Text", node.Text)
);
}

C#TreeView读取Xml,TreeView导出到Xml的更多相关文章

  1. 项目笔记:导出XML和导出全部XML功能

    前台代码: //导出一条Xml function btn_createXml(){ var title =$("#editButton").attr("title&quo ...

  2. C#基础精华06(Linq To XML,读取xml文件,写入xml)

    1.XML概述: 可扩展标记语言XML(eXtensible Markup Language)是一种简单灵活的文本格式的可扩展标记语言,侧重于存储数据. 2.XML特点 xml 标记语言 html x ...

  3. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  4. 做参数可以读取参数 保存参数 用xml文件的方式

    做参数可以读取参数 保存参数 用xml文件的方式 好处:供不同用户保存适合自己使用的参数

  5. ADO.NET笔记(一)XML导入导出和数据库

    数据导出成XML文件 #region 数据导出成XML文件 string sql = "select Id, CallerNumber, TelNum, StartDateTime, End ...

  6. java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .

    背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...

  7. [SQLXML]FOR XML语法导出XML的易错之处

    原文:[SQLXML]FOR XML语法导出XML的易错之处 [SQLXML]FOR XML语法导出XML的易错之处 Version Date Creator Description 1.0.0.1 ...

  8. C#使用Linq To XML读取XML,Linq生成XML,Linq创建带属性或带节点XML

    using System; using System.Linq; using System.Xml.Linq; namespace Sample2 { class Program { static v ...

  9. 创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候 不需要创建新的doc对象

    创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候不 需要创建新的doc对象 直接添加即可 他会同步过去

随机推荐

  1. Windows Server 2008 正式版下载汇总

    windows 2008是微软推出的新一代服务器专用系统版本, 具有良好的用户体验以及应用程序,windows 2008大幅提升了web服务以及应用程序的性能, 让企业在提供和维护资源服务的时候更加得 ...

  2. A1083 List Grades (25)(25 分)

    A1083 List Grades (25)(25 分) Given a list of N student records with name, ID and grade. You are supp ...

  3. UVA:11297-Census(二维线段树)

    Census Time Limit: 8 sec Description This year, there have been many problems with population calcul ...

  4. HTTP认证之摘要认证——Digest(一)

    导航 HTTP认证之基本认证--Basic(一) HTTP认证之基本认证--Basic(二) HTTP认证之摘要认证--Digest(一) HTTP认证之摘要认证--Digest(二) 一.概述 Di ...

  5. laravel5.2总结--服务提供者,契约(Contracts)

    首先理解两个概念 1.契约:一组定义了框架核心服务的接口 2.服务提供者:所有 Laravel 应用程序启动的中心所在. 包括你自己的应用程序,以及所有的 Laravel 核心服务,都是通过服务提供者 ...

  6. [网站公告]11月26日00:00-04:00阿里云RDS升级

    大家好,11月26号00:00-04:00(今天夜里),阿里云将对我们所用的SQL Server RDS实例所在的物理主机做升级操作(目前博客园整站运行于阿里云上),升级期间RDS实例会有2次闪断,每 ...

  7. 接口测试之post和get的区别

    post和get都可以给服务器发送请求,在做接口测试的时候,我发现有些时候某些功能的接口文档中是用post请求发送的, 但是只要接口一致参数一致用post也能发送请求,并且获取到的返回也是正确的. 那 ...

  8. 微信小程序--微信小程序tabBar不显示:缺少文件,错误信息:error:iconPath=

    1.list中的第一个tab的地址必须定义在pages 中 2.pagePath的地址一定要正确 正确写法是: "tabBar": { "color": &qu ...

  9. Unity 脚本<2>

    UnityEngine; using System.Collections; public class PlayerControl : MonoBehaviour { [HideInInspector ...

  10. c++ 中pair类模板的用法详解

    pair: 头文件:#include<utility> 类模板:template <class T1, class T2> struct pair 参数:T1是第一个值的数据类 ...