1. 仔细观察如下窗口及world.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<World>
<Person>
<Id>101</Id>
<Name>刘德华</Name>
<Sex>男</Sex>
<Age>45</Age>
</Person>
<Person>
<Id>102</Id>
<Name>章子怡</Name>
<Sex>女</Sex>
<Age>35</Age>
</Person>
<Student>
<Id>201</Id>
<Name>周杰伦</Name>
<Sex>男</Sex>
<Age>25</Age>
<Favor>双节棍</Favor>
</Student>
<Student>
<Id>202</Id>
<Name>梅梅</Name>
<Sex>女</Sex>
<Age>17</Age>
<Favor>冰淇淋</Favor>
</Student>
<Teacher>
<Id>301</Id>
<Name>刘老根</Name>
<Sex>男</Sex>
<Age>60</Age>
<Year>30</Year>
</Teacher>
<Teacher>
<Id>302</Id>
<Name>药匣子</Name>
<Sex>男</Sex>
<Age>55</Age>
<Year>25</Year>
</Teacher>
</World>
2. 完成以下功能:
2.1. 设计性别枚举Sex。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FrmPerson
{
#region 性别枚举
/// <summary>
/// 性别枚举
/// </summary>
public enum Sex
{
男, 女
}
#endregion
}
2.2. 设计人类Person。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FrmPerson
{
/// <summary>
/// 人类(抽象类)
/// </summary>
public abstract class Person
{
#region 属性
/// <summary>
/// 编号
/// </summary>
public string Id { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 性别
/// </summary>
public Sex Sex { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 爱好
/// </summary>
public string Favor { get; set; }
/// <summary>
/// 教龄
/// </summary>
public string Year { get; set; }
#endregion
#region 抽象方法
/// <summary>
/// 抽象方法
/// </summary>
/// <param name="personList">Person集合</param>
public abstract void InitPersonList(List<Person> personList);
#endregion
}
}
2.3. 设计学生类Student,继承Person类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace FrmPerson
{
/// <summary>
/// 学生类
/// </summary>
public class Student:Person
{
#region 实现父类的抽象方法,解析XML文件
/// <summary>
/// 解析XML文件,并将解析后的对象添加到集合中
/// </summary>
/// <param name="personList">Person集合</param>
public override void InitPersonList(List<Person> personList)
{
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("World.xml");
XmlNodeList xmlNodeList = xmlDoc.GetElementsByTagName("Student");
foreach (XmlNode node in xmlNodeList)
{
//通过简单工厂,根据类型创建对象
Person per = PersonFactory.GetPerson("Student");
per.Id = node["Id"].InnerText;
per.Name = node["Name"].InnerText;
per.Sex = (Sex)Enum.Parse(typeof(Sex), node["Sex"].InnerText);
per.Age = Convert.ToInt32(node["Age"].InnerText);
per.Favor = node["Favor"].InnerText;
per.Year = "无";
personList.Add(per);
}
}
catch(Exception ex)
{
throw new Exception("文件加载错误!"+ex.Message);
}
}
#endregion
}
}
2.4. 设计教师类Teacher,继承Person类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace FrmPerson
{
public class Teacher:Person
{
#region 实现父类的抽象方法,解析XML文件
/// <summary>
/// 解析XML文件,并将解析后的对象添加到集合中
/// </summary>
/// <param name="personList">Person集合</param>
public override void InitPersonList(List<Person> personList)
{
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("World.xml");
XmlNodeList xlmNodeList = xmlDoc.GetElementsByTagName("Teacher");
foreach (XmlNode node in xlmNodeList)
{
//通过简单工厂,根据类型创建对象
Person per = PersonFactory.GetPerson("Teacher");
per.Id = node["Id"].InnerText;
per.Name = node["Name"].InnerText;
per.Sex = (Sex)Enum.Parse(typeof(Sex), node["Sex"].InnerText);
per.Age = Convert.ToInt32(node["Age"].InnerText);
per.Favor = "无";
per.Year = node["Year"].InnerText;
personList.Add(per);
}
}
catch(Exception ex)
{
throw new Exception("文件加载错误!"+ex.Message);
}
}
#endregion
}
}
2.5. 设计Person类Actor,继承Person类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace FrmPerson
{
/// <summary>
/// Person类
/// </summary>
public class Actor:Person
{
#region 实现父类的抽象方法,解析XML文件
/// <summary>
/// 解析XML文件,并将解析后的对象添加到集合中
/// </summary>
/// <param name="personList">Person集合</param>
public override void InitPersonList(List<Person> personList)
{
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("World.xml");
XmlNodeList xmlNodeList = xmlDoc.GetElementsByTagName("Person");
foreach (XmlNode node in xmlNodeList)
{
//通过简单工厂,根据类型创建对象
Person per = PersonFactory.GetPerson("Person");
per.Id = node["Id"].InnerText;
per.Name = node["Name"].InnerText;
per.Sex = (Sex)Enum.Parse(typeof(Sex), node["Sex"].InnerText);
per.Age = Convert.ToInt32(node["Age"].InnerText);
per.Favor = "无";
per.Year = "无";
personList.Add(per);
}
}
catch(Exception ex)
{
throw new Exception("数据加载错误!"+ex.Message);
}
}
#endregion
}
}
2.6. 设计简单工厂PersonFactory,创建各个对象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FrmPerson
{
/// <summary>
/// 工厂类,用于实例化对象
/// </summary>
public class PersonFactory
{
#region 实例化Person对象
/// <summary>
/// 实例化Person对象,并返回
/// </summary>
/// <param name="type">要实例化的类型</param>
/// <returns>返回实例化的对象</returns>
public static Person GetPerson(string type)
{
Person per = null;
switch (type)
{
case "Person":
per = new Actor(); break;
case "Student":
per = new Student(); break;
case "Teacher":
per = new Teacher(); break;
default:
break;
}
return per;
}
#endregion
}
}
2.7. 创建全局集合persons,用于保存全部对象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace FrmPerson
{
/// <summary>
/// Person管理类,用于初始化Person信息
/// </summary>
public class PersonManage
{
#region 无参构造
/// <summary>
/// 构造函数,用于实例化Person集合
/// </summary>
public PersonManage()
{
Persons = new List<Person>();
}
#endregion
#region Person集合属性
/// <summary>
/// Person集合
/// </summary>
public List<Person> Persons { get; set; }
#endregion
#region 初始化Person集合
/// <summary>
/// 初始化Person集合
/// </summary>
public void InitPerson()
{
this.Persons.Clear(); //清空集合
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("World.xml");
XmlNode parensNode = xmlDoc.DocumentElement;
string name = null;
foreach (XmlNode personNode in parensNode.ChildNodes)
{
//加载的类型重复的话跳过
if (name == personNode.Name)
{
continue;
}
name = personNode.Name;
Person per = PersonFactory.GetPerson(name);
per.InitPersonList(Persons);
}
}
catch(Exception ex)
{
throw new Exception("文件加载错误!"+ex.Message);
}
}
#endregion
}
}
2.8. 窗体加载时读取World.xml文件,并创建所有对象存入persons集合。
2.9. 窗体加载时将persons集合信息显示在ListView控件上。
3. 事件处理:
3.1. 点击ListView中的一项,在文本框中显示该项内容。
3.2. 点击“首条”、“前条”、“后条”、“尾条”按钮,可以从当前显示位置翻看集合中的相应对象内容。
4. 打印功能:
4.1. 在硬盘上保存Persons.txt文本文件。内容格式如下:
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.IO;
namespace FrmPerson
{
public partial class FrmPerson : Form
{
public FrmPerson()
{
InitializeComponent();
}
PersonManage pm = new PersonManage(); //Person管理对象
int index = 0; //用于设置集合下标
#region 窗体加载,初始化Person信息,并且在ListView上显示人员信息
private void FrmPerson_Load(object sender, EventArgs e)
{
try
{
pm.InitPerson();
BinLvPerson();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
#endregion
#region 将数据显示在ListView控件上的方法
/// <summary>
/// 绑定ListView控件
/// </summary>
private void BinLvPerson()
{
foreach (Person per in pm.Persons)
{
ListViewItem item = new ListViewItem();
item.Text = per.Id;
item.SubItems.AddRange(new string[] { per.Name, per.Sex.ToString(), per.Age.ToString(), per.Favor, per.Year.ToString() });
lvPerson.Items.Add(item);
}
}
#endregion
#region 在文本框中显示ListView控件中选中的行
private void lvPerson_Click(object sender, EventArgs e)
{
index = this.lvPerson.SelectedItems[0].Index;
ShowPerson(index);
}
#endregion
#region 文本框显示Person信息的方法
/// <summary>
/// 文本框显示Person信息的方法
/// </summary>
/// <param name="index">要显示的集合元素的下标</param>
private void ShowPerson(int index)
{
if (pm.Persons.Count==0)
{
return;
}
Person per = pm.Persons[index];
this.txtNo.Text = per.Id;
this.txtName.Text = per.Name;
this.txtSex.Text = per.Sex.ToString();
this.txtAge.Text = per.Age.ToString();
this.txthobby.Text = per.Favor;
this.txtSchoolAge.Text = per.Year;
}
#endregion
#region 点击按钮在文本框中显示Person信息
private void btn_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
switch (btn.Text)
{
case "首条":
index = 0;
break;
case "前条":
if (index <= 0)
{
MessageBox.Show("已经是第一条了!");
return;
}
index--;
break;
case "后条":
if (index >= pm.Persons.Count - 1)
{
MessageBox.Show("已经是最后一条了!");
return;
}
index++;
break;
case "尾条":
index = pm.Persons.Count - 1;
break;
}
ShowPerson(index);
}
#endregion
#region 打印信息
private void btnPrint_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("PersonInfo.txt");
sw.WriteLine("--------人员清单--------");
foreach (Person per in pm.Persons)
{
sw.WriteLine("姓名:{0}" , per.Name);
sw.WriteLine("性别:{0}", per.Sex);
sw.WriteLine("年龄:{0}", per.Age);
sw.WriteLine("爱好:{0}", per.Favor);
sw.WriteLine("教龄:{0}", per.Year);
sw.WriteLine("------------");
}
sw.Close();
MessageBox.Show("打印成功!");
}
#endregion
#region 退出程序
private void btnExit_Click(object sender, EventArgs e)
{
DialogResult dr=MessageBox.Show("确定要退出吗?","操作提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
if (dr==DialogResult.OK)
{
Application.Exit();
}
}
#endregion
}
}
--------人员清单--------
姓名:刘德华
性别:男
年龄:45
爱好:无
教龄:无
姓名:章子怡
性别:女
年龄:35
爱好:无
教龄:无
------------
姓名:周杰伦
性别:男
年龄:25
爱好:双节棍
教龄:无
------------
姓名:梅梅
性别:女
年龄:17
爱好:冰淇淋
教龄:无
------------
姓名:刘老根
性别:男
年龄:60
爱好:无
教龄:30
------------
姓名:药匣子
性别:男
年龄:55
爱好:无
教龄:25
------------
5. 程序要求:
5.1. 对独立功能代码尽量使用方法编写和调用。
5.2. 注意代码规范。
5.3. 必要的异常处理。
5.4. 必要的注释。
如需完整项目,可到http://www.bdjava.com/forum.php?mod=viewthread&tid=21&page=1&extra=#pid22位置下载附件
本文档详细介绍了如何解析XML文件并将其内容显示在窗体上。内容包括设计枚举、类结构,如Person、Student、Teacher和Actor,以及使用简单工厂模式创建对象。窗体加载时读取world.xml文件,将数据存入集合并在ListView控件中展示。此外,还实现了事件处理,如点击列表项显示详细信息,以及翻看集合中其他对象的功能。同时,提供了打印功能,将人员信息保存为文本文件。文章强调代码规范、异常处理和注释的重要性。
924

被折叠的 条评论
为什么被折叠?



