XML完成小程序
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完成小程序的更多相关文章
- 自动生成百度小程序sitemap.txt文件路径
因为业务需要,需要在目前项目上开发一个百度小程序,百度智能小程序上线了,但是内容每天得推送,不可能一个小程序路径一个推送吧,因为小程序路径和项目路径不一致. 因为项目是用ThinkPHP开发的,在此附 ...
- 小程序视图层(xx.xml)和逻辑层(xx.js)
整个系统分为两块视图层(View)和逻辑层(App Service) 框架可以让数据与视图非常简单地保持同步.当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新. 通过这个简单的例子来 ...
- PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)
1.微信公众号.微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数: 分别是xml_to_array.array_to_xml ; /** * 输出xml字符 ...
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件
通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二). 前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...
- 微信小程序xml解析
准备: 下载xmldom库:https://github.com/jindw/xmldom 将dom.js.dom-parser.js.sax.js,entities.js拷贝微信小程序需要的文件夹下 ...
- 微信小程序(微信应用号)组件讲解
这篇文章主要讲解微信小程序的组件. 首先,讲解新建项目.现在有句话:招聘三天以上微信小程序开发,这个估计只能去挖微信的工程师了.技术新,既然讲解,那我们就从开始建项目讲解. 打开微信web开发者工具, ...
- 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- 通过微信小程序看前端
前言 2016年9月22日凌晨,微信官方通过“微信公开课”公众号发布了关于微信小程序(微信应用号)的内测通知.整个朋友圈瞬间便像炸开了锅似的,各种揣测.介绍性文章在一夜里诞生.而真正收到内测邀请的公众 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
随机推荐
- 浅谈后缀自动机SAM
一下是蒟蒻的个人想法,并不很严谨,仅供参考,如有缺误,敬请提出 参考资料: 陈立杰原版课件 litble 某大神 某大神 其实课件讲得最详实了 有限状态自动机 我们要学后缀自动机,我们先来了解一下自动 ...
- 编程风格---代码中doxygen方式的注释写法
代码中doxygen方式的注释写法: 1. 模块定义(单独显示一页) /* * @defgroup 模块名 模块的说明文字 * @{ */ … 定义的内容 … /** @} */ // 模块结尾 2. ...
- bootstrap之常见组件应用1
bootstrap中,常见的组件有很多,比如按钮,输入框,导航条,巨幕,面板等.这次根据对bootstrap的一系列学习进行总结. 按钮:button <button type="bu ...
- bzoj1040 基环树上dp
[bzoj1040][ZJOI2008]骑士 2014年2月26日5,2040 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 ...
- pat 甲级 L3-002. 堆栈
L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...
- Cookies设置,获取,删除
之前的博客,整理了下Session的存储方式和原理http://www.cnblogs.com/chinaagan/p/3200456.html. 本篇再次整理下Cookies的使用和原理. 参考博客 ...
- ZOJ1608 Two Circles and a Rectangle
Time Limit: 2 Seconds Memory Limit: 65536 KB Give you two circles and a rectangle, your task is ...
- 【BZOJ4481&JSOI2015】非诚勿扰(数学期望)
听说JSOI有版权问题就不放图了 如果前面的文章里的图需要删掉请通知我 题意:有一些女的要挑一些男的,挑中的几率均为p.一个男的可以无限次被挑中.若女a选中男b,女c选中男d,a<c,b> ...
- Mongoose 表实例
/********** 用户表 BY Jaysir 2015.6.21 *********** *********** 可搜索以下关键词来查看未实现功能 *********** *********** ...
- User Experience Collection
about a data driven system front end: 1. about succeeded requests: they do not want to see alerts ab ...