解析XML,将数据显示在treeview上,使用简单工厂模式
题目:饮料代理公司商品预定管理
某公司为实现所售商品的有效管理,更好的为客户提供服务,拟定制作一套进销存软件,本例只实现其中的商品预定功能和定单打印,所商品信息如下:
商品名称 ShoppingName |
类型 BeverageType |
单价 Unit_price |
产地 Producing_area |
营养说明 Alimentation_explain |
库存数量 Stock_amount |
容量(升) Capacity |
一统绿茶 |
低糖 |
3.5 |
一统公司 |
|
5 |
1.25 |
乐乐可乐 |
碳酸 |
3 |
笑笑公司 |
|
3 |
2.0 |
一统牛饮 |
功能 |
6 |
一统公司 |
富含多种维生素 |
10 |
0.35 |
实现要求:
1、分析上表,要求对饮料类型进行封装,要求使用枚举(BeverageType);
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ShoppingDemo_6 7 { 8 /// <summary> 9 /// 枚举 10 /// </summary> 11 public enum BeverageType 12 { 13 低糖,碳酸,功能 14 } 15 }
2、分析上表,要求对商品(饮料)进行类封装,封装饮料类(BaseBeverage);
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 7 namespace ShoppingDemo_6 8 { 9 /// <summary> 10 /// 饮料类 11 /// </summary> 12 public class BaseBeverage 13 { 14 /// <summary> 15 /// 商品名称 16 /// </summary> 17 public string ShoppingName { get; set; } 18 19 /// <summary> 20 /// 商品类型 21 /// </summary> 22 public BeverageType BeverageType { get; set; } 23 24 /// <summary> 25 /// 商品单价 26 /// </summary> 27 public double Unit_price { get; set; } 28 29 /// <summary> 30 /// 产地 31 /// </summary> 32 public string Producing_area { get; set; } 33 34 /// <summary> 35 /// 库存 36 /// </summary> 37 public int Stock_amount { get; set; } 38 39 /// <summary> 40 /// 容量 41 /// </summary> 42 public double Capacity { get; set; } 43 44 /// <summary> 45 /// 打印的方法 46 /// </summary> 47 public virtual void Print() 48 { 49 StreamWriter sw = new StreamWriter("Save.txt"); 50 sw.WriteLine("--------商品信息--------"); 51 sw.WriteLine("商品名称:"+ShoppingName); 52 sw.WriteLine("类型:" + BeverageType); 53 sw.WriteLine("单价:" + Unit_price); 54 sw.WriteLine("产地:" + Producing_area); 55 sw.WriteLine("营养说明:无" ); 56 sw.WriteLine("库存数量:" + Stock_amount); 57 sw.WriteLine("容量(升):" + Capacity); 58 sw.Close(); 59 } 60 } 61 }
3、分析上表,要求使用继承来对功能饮料(FunctionalBeverage)进行封装,注意调用父类的构造函数(5分);
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 7 namespace ShoppingDemo_6 8 { 9 /// <summary> 10 /// 功能饮料 11 /// </summary> 12 public class FunctionalBeverage:BaseBeverage 13 { 14 /// <summary> 15 /// 营养说明 16 /// </summary> 17 public string Alimentation_explain { get; set; } 18 19 /// <summary> 20 /// 打印的方法 21 /// </summary> 22 public override void Print() 23 { 24 StreamWriter sw = new StreamWriter("Save.txt"); 25 sw.WriteLine("--------商品信息--------"); 26 sw.WriteLine("商品名称:" + ShoppingName); 27 sw.WriteLine("类型:" + BeverageType); 28 sw.WriteLine("单价:" + Unit_price); 29 sw.WriteLine("产地:" + Producing_area); 30 sw.WriteLine("营养说明:"+Alimentation_explain); 31 sw.WriteLine("库存数量:" + Stock_amount); 32 sw.WriteLine("容量(升):" + Capacity); 33 sw.Close(); 34 } 35 } 36 }
4、创建一个BeverageManager完成商品的管理,使用List< BaseBeverage >泛型集合存储饮料信息(要求只读属性),提价Load BaseBeverage方法,实现将xml数据解析到List< BaseBeverage >集合对象中;
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Xml; 6 7 namespace ShoppingDemo_6 8 { 9 public class BeverageManager 10 { 11 public BeverageManager() 12 { 13 beverageList = new List<BaseBeverage>(); 14 } 15 private List<BaseBeverage> beverageList; 16 /// <summary> 17 /// 饮料信息 18 /// </summary> 19 public List<BaseBeverage> BeverageList 20 { 21 get { return beverageList; } 22 } 23 24 /// <summary> 25 /// 解析XML并将数据添加到集合中 26 /// </summary> 27 public void LoadBaseBeverage() 28 { 29 XmlDocument xmlDoc = new XmlDocument(); 30 xmlDoc.Load("Data.xml"); 31 XmlNodeList parentNode = xmlDoc.GetElementsByTagName("饮料"); 32 foreach (XmlNode node in parentNode) 33 { 34 string type = node.Attributes["Type"].Value; 35 string alimentation_explain = ""; 36 if (type == "Base") 37 { 38 alimentation_explain = "无"; 39 } 40 if (type == "Functional") 41 { 42 alimentation_explain = node["营养说明"].InnerText; 43 } 44 BaseBeverage beverage = BeverageFactory.CreatBeverage(type, 45 node["名称"].InnerText, 46 (BeverageType)Enum.Parse(typeof(BeverageType), node["类型"].InnerText), 47 Convert.ToDouble(node["单价"].InnerText), 48 node["产地"].InnerText, 49 Convert.ToDouble(node["容量"].InnerText), 50 Convert.ToInt32(node["库存"].InnerText), 51 alimentation_explain); 52 BeverageList.Add(beverage); 53 } 54 } 55 } 56 }
XML文件内容如下
1 <?xml version="1.0" encoding="utf-8"?> 2 <商品信息> 3 <饮料 Type="Base"> 4 <名称>一统绿茶</名称> 5 <类型>低糖</类型> 6 <单价>3.5</单价> 7 <产地>一统公司</产地> 8 <容量>1.25</容量> 9 <库存>5</库存> 10 </饮料> 11 <饮料 Type="Base"> 12 <名称>乐乐可乐</名称> 13 <类型>碳酸</类型> 14 <单价>3</单价> 15 <产地>笑笑公司</产地> 16 <容量>2</容量> 17 <库存>3</库存> 18 </饮料> 19 <饮料 Type="Functional"> 20 <名称>一统牛饮</名称> 21 <类型>功能</类型> 22 <单价>6</单价> 23 <产地>一统公司</产地> 24 <容量>0.35</容量> 25 <库存>10</库存> 26 <营养说明>富含多种维生素</营养说明> 27 </饮料> 28 </商品信息>
5、按照下图绘制程序的主界面并完成要求的功能.
图1:主界面
要求:(1)载入时初始化饮料数据(参照表格中的数据);
(2)根据初始化的数据填充树控件,并显示如上图的效果;
(3)完成点击树中节点显示详细信息的功能,当为功能饮料时,要显示营养成份
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.IO; 10 11 namespace ShoppingDemo_6 12 { 13 public partial class FrmBeverage : Form 14 { 15 public FrmBeverage() 16 { 17 InitializeComponent(); 18 } 19 20 BeverageManager bm = new BeverageManager(); 21 int index=0; 22 private void FrmBeverage_Load(object sender, EventArgs e) 23 { 24 binCombobox(); 25 bm.LoadBaseBeverage(); 26 BinTreeView(); 27 } 28 29 /// <summary> 30 /// 绑定combobox 31 /// </summary> 32 private void binCombobox() 33 { 34 cboBeverageType.DataSource = Enum.GetValues(typeof(BeverageType)); 35 } 36 37 /// <summary> 38 /// 将数据绑定到treeview上 39 /// </summary> 40 private void BinTreeView() 41 { 42 TreeNode node = new TreeNode(); 43 node.Text = "饮料"; 44 this.tvBeverage.Nodes.Add(node); 45 foreach (BaseBeverage item in bm.BeverageList) 46 { 47 node.Nodes.Add(item.ShoppingName); 48 } 49 } 50 51 private void tvBeverage_AfterSelect(object sender, TreeViewEventArgs e) 52 { 53 if (this.tvBeverage.SelectedNode.Level == 0) 54 { 55 return; 56 } 57 index = this.tvBeverage.SelectedNode.Index; 58 BinText(index); 59 } 60 61 /// <summary> 62 /// 在文本框显示数据 63 /// </summary> 64 /// <param name="index"></param> 65 private void BinText(int index) 66 { 67 BaseBeverage bb = bm.BeverageList[index]; 68 string alimentation_explain = "无"; 69 if (bb is FunctionalBeverage) 70 { 71 alimentation_explain = ((FunctionalBeverage)bb).Alimentation_explain; 72 } 73 txtShoppingName.Text = bb.ShoppingName; 74 txtAlimentation_explain.Text = alimentation_explain; 75 txtCapacity.Text = bb.Capacity.ToString(); 76 txtProducing_area.Text = bb.Producing_area; 77 txtStock_amount.Text = bb.Stock_amount.ToString(); 78 txtUnit_price.Text = bb.Unit_price.ToString(); 79 cboBeverageType.Text = bb.BeverageType.ToString(); 80 } 81 /// <summary> 82 /// 4个按钮共用的单击事件 83 /// </summary> 84 /// <param name="sender"></param> 85 /// <param name="e"></param> 86 private void LoadText(object sender, EventArgs e) 87 { 88 Button btn = (Button)sender; 89 string str = btn.Text; 90 switch (str) 91 { 92 case "首条": 93 index = 0; 94 break; 95 case "前条": 96 index = index == 0 ? 0 : --index; 97 break; 98 case "后条": 99 index = index == bm.BeverageList.Count - 1 ? bm.BeverageList.Count - 1 : ++index; 100 break; 101 case "尾条": 102 index = bm.BeverageList.Count - 1; 103 break; 104 } 105 BinText(index); 106 } 107 108 private void btnExit_Click(object sender, EventArgs e) 109 { 110 DialogResult dr = MessageBox.Show("确定退出吗?","退出提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question); 111 if (dr==DialogResult.OK) 112 { 113 Application.Exit(); 114 } 115 } 116 117 /// <summary> 118 /// 打印按钮 119 /// </summary> 120 /// <param name="sender"></param> 121 /// <param name="e"></param> 122 private void btnPrint_Click(object sender, EventArgs e) 123 { 124 BaseBeverage bb = bm.BeverageList[index]; 125 if (bb is FunctionalBeverage) 126 { 127 bb = (FunctionalBeverage)bb; 128 } 129 bb.Print(); 130 } 131 } 132 }
【注:购买信息部分不需要完成】