XML文档的格式如下:

<?xml version="1.0" encoding="utf-8"?>

<学生名单>

<学生 Name="李四一" class="0102">

<性别>男</性别>

<生日>1999年1月2日</生日>

<学号>20170</学号>

</学生>

<学生 Name="张三三"  class="高一">

<性别>男</性别>

<学号>0102</学号>

<生日>2017年6月18日</生日>

</学生>

</学生名单>

数据在DateGridView中的显示

将XML中的数据,顺序显示在DataGridView控件中

//创建一个datatable存储XML中的数据

DataTable dt=new DataTable();

//指定每一列的列名,和数据类型

dt.Columns.Add("Id",(typeof(System.String)));

dt.Columns.Add("班级",(typeof(System.String)));

dt.Columns.Add("姓名",(typeof(System.Strng)));

dt.Columns.Add("学号".(typeof(Sytem.String)));

dt.Columns.Add("生日".(typeof(System.String)));

dt.Columns.Add("性别".(typeof(System.String)));

//创建一个DataRow对象

DataRow dr=dt.NewRow();

XmlDocument doc=new XmlDocument();

//为相对路径表示前二级的目录

doc.Load(@"..//..//Students.xml");

XmlElement root=doc.DocumentElenment;

XmlNodeList studentNodes=root.GetElementsByTagName("学生");

//使用foreach遍历集合元素

foreach(var item in studentNodes)

{

dr["Id"]=((XmlElement)item).GetAttribute("Id");

dr["班级"]=((XmlElement)item).GetAttribute("Class");

dr["姓名"]=((XmlElement)item).GetAttribute("Name");

dr["学号"]=((XmlElement)item).GetElementsByTagName("学号")[0].InnerText;

dr["生日"]=((XmlElement)item).GetElementsByTagName("生日")[0].InnerText;

dr["性别"]=((XmlElement)item).GetElementsByTagName("性别")[0].InnerText;

dt.Rows.Add(dr);

}

//将DataTable绑定到DataGridView控件

dgvStudents.DataSource=dt;

增加记录

因为添加学生和编辑学生都需要在同一个窗体,那么在打开添加或编辑窗体时使用构造函数来传值,并判断是编辑还是添加

添加编辑窗体代码:

public partial class FrmStudentAddandEdit:Form

{

//全局变量接受传值

bool IsAdd;

string Name;

//使用构造函数进行传值true为增加,FALSE为编辑

public FrmStudentAddandEdit(bool isAdd,string name)

{

this.IsAdd=isAdd;

this.Name=name;

InitializeComponent();

}

}

主窗体添加按钮单击事件代码:

private void btnAdd_Click(object sender,EventArgs e)

{

//在创建窗体时传值

FrmStudentAddandEdit form=new FrmStudentAddandEdit(true)'

form.ShowDialog();

}

新增记录代码:

private void btnOK_Click(object sender,EventArgs e)

{

XmlDocument doc=new XmlDocument();

doc.Load(@"..//..//Students.xml");

XmlElement root=doc.DocumentElement;

//添加《学生》子节点

XmlElement Shutdent=doc.CreateElement("学生");

//设置Name属性和Class属性

Shutdent.SetAttribute("Name",txtName.Text.Trim());

Shutdent.SetAttribute("Class",txtClass.Text.Trim());

//创建子节点

XmlElement eSex=doc.CreateElement("性别");

XmlText tSex=doc.CreateTextNode(cmbSex.Text.Trim());

//子节点添加内容

eSex.AppendChild(tSex);

//将子节点添加学生标记

Shutdent.AppendChild(eSex);

XmlElement eNum=doc.CreateElement("学号");

XmlText tNum=doc.CreateTextNode(txtNumber.Text.Trim());

eNum.AppendChild(tNum);

Shutdent.AppendChild(eNum);

XmlElement eBirthday=doc.CreateElement("生日");

XmlText tBirthday=doc.CreateTextNode(dtpBirthday.Text.Trim('-'));

eBirthday.AppendChild(tBirthday);

Shutdent.AppendChild(eBirthday);

//将学生标记添加进根结点

root.AppendChild(Shutdent);

doc.Save(@"..//..//Students.xml");

MessageBox.Show("添加成功!");

this.Close();

}

编辑记录

由于编辑需要查找到这条记录然后复制到控件中显示,那么在我们启动“添加或编辑窗体”时需要判断当前是添加状态还是编辑状态,并将表格选择行的姓名字段传给构造函数,通过这个姓名字段查找相应的值,然后筛选出来再给控件赋值

主窗口编辑按钮单击事件:

private void btnEdit_Click(object sender,EventArgs e)

{

//获取当前选择表格的行索引

int dgvIndex=dgvStudents.CurrentRow.Index;

//根据行索引获取单元格的值

string name=dgvStudents.Rows[dgvIndex].Cells["姓名"].Value.ToString();

FrmStudentAddandEdit form=new FrmStudentAddandEdit(false,name);

form.ShowDialog();

}

窗体启动事件进行判断是添加还是编辑:

private void FrmStudentAddandEdit_Load(object sender,EventArgs e)

{

if(IsAdd){

this.Text="添加学生”;

}

else

{

this.Text="编辑学生名单";

XmlDocument doc=new XmlDocument();

doc.Load(@"..//..//Students.xml");

XmlElement root=doc.DocumentElement;

//筛选出符合条件的标记

XmlElement selectEle=(XmlElement)root.SelectSingleNode("/学生名单/学生[@Name='"+Name+"']");

//筛选出符合条件并给控件赋值

txtName.Text=selectEle.GetAttribute("Name");

txtClass.Text=selectEle.GetAttribute("Class");

txtNumber.Tex=selectEle.GetElementsByTagName("学号“)[0].InnerText;

dtpBirthday.Text=selectEle.GetElemensByTagName("生日")[0].InnerTextl;

cmbSex.Text=selectEle.GetElementsByTagName("性别")[0].InnerText;

}

}

同样在编辑好内容后,单击确定按钮后判断当前是添加状态还是编辑状态:

private void btnOK_Click(object sender,EventArgs e)

{

if(IsAdd)

{

//添加记录代码

}

else

{

this.Text="编辑学生名单";

XmlDocument doc=new XmlDocument();

doc.Load(@"..//..//Students.xml");

XmlElement root=doc.DocumentElement;

//筛选出符合条件的标记

XmlElement selectEle=(XmlElement)root.SelectSingleNode("/学生名单/学生[@Name='"+Name+"']");

selectEle.SetAttribute("Name",txtName.Text.Trim());

selectEle.SetAttribute("Class",txtClass.Text.Trim());

//筛选出的对象赋给XMLElement对象

XmlElement eSex=(XmlElement)selectEle.GetElementsByTagName("性别")[0];

eSex.InnerText=cmbSex.Text;

XmlElement eNumber=(XmlElement)selectEle.GetElementsByTagName("学号")[0];

eNumber.InnerText=txtNumber.Text;

XmlElement eBirth=(XmlElement)selectEle.GetElementsByTagName("生日")[0];

eBirth.InnerText=dtpBirthday.Text;

doc.Save(@"..//..//Students.xml");

MessageBox.Show("修改成功!");

//这一步很重要一定要关闭窗口不然再次修改会出现不可预料的BUG

this.Close();

}

}

删除记录

也是一样的逻辑获取当前选择表格的姓名字段,然后按照相关姓名进行删除,如果姓名不是唯一字段,那么可以使用ID,每次添加一次记录的时候最大ID+1

//获取当前选择表格的行索引及姓名

int dgvIndex=dgvStudents.CurrentRow.Index;

string name=dgvStudents.Rows[dgvIndex].Cells["姓名"].Value.ToString();

//筛选出符合条件的标记

XmlElement selectEle=(XmlElement)root.SelectSingleNode("/学生名单/学生[@Name='"+Name+"']";

//删除指定子元素

root.RemoveChild(selectEle);

doc.Save("...");

XML完成小程序的更多相关文章

  1. 自动生成百度小程序sitemap.txt文件路径

    因为业务需要,需要在目前项目上开发一个百度小程序,百度智能小程序上线了,但是内容每天得推送,不可能一个小程序路径一个推送吧,因为小程序路径和项目路径不一致. 因为项目是用ThinkPHP开发的,在此附 ...

  2. 小程序视图层(xx.xml)和逻辑层(xx.js)

    整个系统分为两块视图层(View)和逻辑层(App Service) 框架可以让数据与视图非常简单地保持同步.当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新. 通过这个简单的例子来 ...

  3. PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)

    1.微信公众号.微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数: 分别是xml_to_array.array_to_xml ; /** * 输出xml字符 ...

  4. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  5. 微信小程序xml解析

    准备: 下载xmldom库:https://github.com/jindw/xmldom 将dom.js.dom-parser.js.sax.js,entities.js拷贝微信小程序需要的文件夹下 ...

  6. 微信小程序(微信应用号)组件讲解

    这篇文章主要讲解微信小程序的组件. 首先,讲解新建项目.现在有句话:招聘三天以上微信小程序开发,这个估计只能去挖微信的工程师了.技术新,既然讲解,那我们就从开始建项目讲解. 打开微信web开发者工具, ...

  7. 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新

    微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...

  8. 通过微信小程序看前端

    前言 2016年9月22日凌晨,微信官方通过“微信公开课”公众号发布了关于微信小程序(微信应用号)的内测通知.整个朋友圈瞬间便像炸开了锅似的,各种揣测.介绍性文章在一夜里诞生.而真正收到内测邀请的公众 ...

  9. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

随机推荐

  1. 个人环境搭建——搭建JDK环境

    搭建JDK环境 开始之初先提醒两点: ①java是在bash环境下面的,虽然我也在.cshrc下面添加了环境变量,好像有点问题,需要继续改进: ②查看linux版本信息命令:cat /etc/issu ...

  2. C++ Contest Code preprocessor

    大概可以拿来方便拉模板 变量名.语法都是瞎整的你感觉有用随便用好了.. #include<bits/stdc++.h> using namespace std; map<string ...

  3. poj 1743 Musical Theme 后缀自动机/后缀数组/后缀树

    题目大意 直接用了hzwer的题意 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题."主题&qu ...

  4. JavaScript中in的用法

    JavaScript中的in 操作符是对Object(对象)操作的,并不是针对数组. in 的右边必须是对象变量 例如:var data = {id:1, name:'AAA'};if('name' ...

  5. BZOJ 3640: JC的小苹果

    3640: JC的小苹果 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 425  Solved: 155[Submit][Status][Discus ...

  6. [CODEVS1130]数字反转

    题目描述 Description 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零. 这是一道水题.我必须 ...

  7. 线程池基础 ThreadPool基础

    原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是 ...

  8. 知乎上的一些文章---leetcode【笔记1】

    张土汪 http://github.com/shawnfan Java{script}代码仔 42 人赞同 [1.19.2017] 更新: 2017年1月17日, 陪我征战多年的 2014 MackB ...

  9. python3.5爬虫框架Scrapy的安装和排错(windows环境)

    本文记录win7系统下使用python3.5安装Scrapy爬虫框架. Scrapy框架目前的官方文档说明是还不支持windows的python3环境的,但是网友反映以及实际测试均可以使用,下面就进行 ...

  10. 【linux】进程存储管理

    看<Linux高级程序设计>的笔记 设有一个hello的可执行文件 ①显示该文件的基本信息 ls hello -l ②文件基本情况 file hello ③列出文件的存储区域情况 size ...