/// <summary>
/// btnXML2Tree_Click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnXML2Tree_Click(object sender, EventArgs e)
{
pnlModifyData.Visible = false;
txtModiData.Text = "";
if (this.dlgOpen.ShowDialog() == DialogResult.OK)
{
DisplayTree();
}
}
private void DisplayTree()
{
if(dlgOpen.FileName.Trim().Length!=0)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(dlgOpen.FileName);
XmlNodeList xmlNodes = xmlDoc.DocumentElement.ChildNodes;
tvwStudents.ShowNodeToolTips = true;
tvwStudents.ShowPlusMinus = true;
TreeNode rootNode = null; //新建根结点rootNode
this.tvwStudents.BeginUpdate();
this.tvwStudents.Nodes.Clear();
rootNode = tvwStudents.Nodes.Add(xmlDoc.LastChild.Name); //将XML中的根结点与rootNode关联
rootNode.Tag = "0";
XmlNode2TreeNode(xmlNodes, rootNode.Nodes); //xmlNodes为全集(除根结点外)的;rootNode.Nodes为空集,做加结点准备
rootNode.Expand(); //展开根结点rootNode
this.tvwStudents.EndUpdate();
}
}
/// <summary>
/// 递归方法 XmlNode2TreeNode
/// </summary>
/// <param name="xmlNode"></param>
/// <param name="treeNode"></param>
private void XmlNode2TreeNode(XmlNodeList xmlNode, TreeNodeCollection treeNode) //递归方法
{
foreach (XmlNode var in xmlNode) //遍历XmlNodeList类对象,
{
TreeNode newTreeNode = new TreeNode();
if (var.NodeType == XmlNodeType.Element) //1 如是元素
{
newTreeNode.Text = var.Name;
if (var.Attributes.Count != 0) //11 如有属性
{
for (int i = 0; i < var.Attributes.Count; i++)
newTreeNode.ToolTipText = var.Attributes[i].Name + ": " + var.Attributes[i].Value;
}
treeNode.Add(newTreeNode);
}
if (var.NodeType == XmlNodeType.Text) //2 如是文本内容
{
newTreeNode.Text = var.Value;
newTreeNode.Tag = "text";
newTreeNode.NodeFont = new Font("宋体", Font.Size+0.1f, FontStyle.Bold);
newTreeNode.ForeColor = Color.DarkBlue;
newTreeNode.BackColor = Color.LightYellow;
treeNode.Add(newTreeNode);
}
if (var.NodeType == XmlNodeType.Comment)
{
newTreeNode.Text = "注: "+var.Value;
newTreeNode.Tag = "comment";
newTreeNode.NodeFont = new Font("黑体",Font.Size, FontStyle.Italic);
newTreeNode.ForeColor = Color.Green;
treeNode.Add(newTreeNode);
}
if (var.HasChildNodes) //3 如有子结点集合
{
XmlNode2TreeNode(var.ChildNodes, newTreeNode.Nodes);
}
}
}
private void btnOK_Click(object sender, EventArgs e)
{
if (tvwStudents.SelectedNode == null) return;
tvwStudents.SelectedNode.Text = txtModiData.Text; //0
XmlDocument xmlDoc = new XmlDocument(); //1
xmlDoc.Load(dlgOpen.FileName);
XmlNode xn = xmlDoc.LastChild;
for (int i = 0; i < sTemp.Length-1; i++)
{
xn = xn.ChildNodes[Convert.ToInt16(sTemp.Substring(i, 1))];
}
xn.InnerText = txtModiData.Text;
xmlDoc.Save(dlgOpen.FileName);
txtModiData.Text = "";
}
private void tvwStudents_AfterSelect(object sender, TreeViewEventArgs e)
{
sTemp = "";
TreeNode tn = tvwStudents.SelectedNode;
int temp = tn.Level;
while (temp != 0)
{
sTemp = tn.Index.ToString().Trim() + sTemp;
tn = tn.Parent;
temp = tn.Level;
}
btnDel.Enabled = false;
pnlModifyData.Visible = false;
if (e.Node.Nodes.Count == 0 && e.Node.Tag.ToString() != "comment")
{
pnlModifyData.Location = new Point(e.Node.Bounds.Left, e.Node.Bounds.Bottom +(int)Font.Size);
pnlModifyData.Visible = true;
}
else
btnDel.Enabled = true;
}
private void btnDel_Click(object sender, EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument(); //1
xmlDoc.Load(dlgOpen.FileName);
XmlNode xn = xmlDoc.LastChild;
for (int i = 0; i < sTemp.Length; i++)
{
xn = xn.ChildNodes[Convert.ToInt16(sTemp.Substring(i, 1))];
}
xn.ParentNode.RemoveChild(xn);
xmlDoc.Save(dlgOpen.FileName);
tvwStudents.Nodes.Remove(tvwStudents.SelectedNode);
}
运行效果图如下:
申明:部分代码来源于网络,感谢那些作者们,谢谢!