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("...");

 

posted @ 2017-06-19 15:16  维尼熊320  阅读(568)  评论(0编辑  收藏  举报