使用简单工厂模式,解析XML文件,并将数据显示在treeview上

来源:互联网 发布:九九乘法表算法 编辑:程序博客网 时间:2024/06/05 21:00

题目:饮料代理公司商品预定管理

       某公司为实现所售商品的有效管理,更好的为客户提供服务,拟定制作一套进销存软件,本例只实现其中的商品预定功能和定单打印,所商品信息如下:

商品名称

ShoppingName

类型

BeverageType

单价

Unit_price

产地

Producing_area

营养说明

Alimentation_explain

库存数量

Stock_amount

容量()

Capacity

一统绿茶

低糖

35

一统公司

5

1.25

乐乐可乐

碳酸

3

笑笑公司

3

2.0

一统牛饮

功能

6

一统公司

富含多种维生素

10

0.35

实现要求:

    1、分析上表,要求对饮料类型进行封装,要求使用枚举(BeverageType);

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ShoppingDemo_6{    /// <summary>    /// 枚举    /// </summary>    public enum BeverageType     {         低糖,碳酸,功能    }}


    2、分析上表,要求对商品(饮料)进行类封装,封装饮料类(BaseBeverage);

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace ShoppingDemo_6{    /// <summary>    /// 饮料类    /// </summary>    public class BaseBeverage    {        /// <summary>        /// 商品名称        /// </summary>        public string ShoppingName { get; set; }        /// <summary>        /// 商品类型        /// </summary>        public BeverageType BeverageType { get; set; }        /// <summary>        /// 商品单价        /// </summary>        public double Unit_price { get; set; }        /// <summary>        /// 产地        /// </summary>        public string Producing_area { get; set; }        /// <summary>        /// 库存        /// </summary>        public int Stock_amount { get; set; }        /// <summary>        /// 容量        /// </summary>        public double Capacity { get; set; }        /// <summary>        /// 打印的方法        /// </summary>        public virtual void Print()        {            StreamWriter sw = new StreamWriter("Save.txt");            sw.WriteLine("--------商品信息--------");            sw.WriteLine("商品名称:"+ShoppingName);            sw.WriteLine("类型:" + BeverageType);            sw.WriteLine("单价:" + Unit_price);            sw.WriteLine("产地:" + Producing_area);            sw.WriteLine("营养说明:无" );            sw.WriteLine("库存数量:" + Stock_amount);            sw.WriteLine("容量(升):" + Capacity);            sw.Close();        }    }}


    3、分析上表,要求使用继承来对功能饮料(FunctionalBeverage)进行封装,注意调用父类的构造函数(5分);

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace ShoppingDemo_6{    /// <summary>    /// 功能饮料    /// </summary>    public class FunctionalBeverage:BaseBeverage    {        /// <summary>        /// 营养说明        /// </summary>        public string Alimentation_explain { get; set; }        /// <summary>        /// 打印的方法        /// </summary>        public override void Print()        {            StreamWriter sw = new StreamWriter("Save.txt");            sw.WriteLine("--------商品信息--------");            sw.WriteLine("商品名称:" + ShoppingName);            sw.WriteLine("类型:" + BeverageType);            sw.WriteLine("单价:" + Unit_price);            sw.WriteLine("产地:" + Producing_area);            sw.WriteLine("营养说明:"+Alimentation_explain);            sw.WriteLine("库存数量:" + Stock_amount);            sw.WriteLine("容量(升):" + Capacity);            sw.Close();        }    }}


    4、创建一个BeverageManager完成商品的管理,使用List< BaseBeverage >泛型集合存储饮料信息(要求只读属性),提价Load BaseBeverage方法,实现将xml数据解析到List< BaseBeverage >集合对象中;

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;namespace ShoppingDemo_6{    public class BeverageManager    {        public BeverageManager()        {            beverageList = new List<BaseBeverage>();        }        private List<BaseBeverage> beverageList;        /// <summary>        /// 饮料信息        /// </summary>        public List<BaseBeverage> BeverageList        {            get { return beverageList; }        }        /// <summary>        /// 解析XML并将数据添加到集合中        /// </summary>        public void LoadBaseBeverage()        {            XmlDocument xmlDoc = new XmlDocument();            xmlDoc.Load("Data.xml");            XmlNodeList parentNode = xmlDoc.GetElementsByTagName("饮料");            foreach (XmlNode node in parentNode)            {                string type = node.Attributes["Type"].Value;                string alimentation_explain = "";                if (type == "Base")                {                    alimentation_explain = "无";                }                if (type == "Functional")                {                    alimentation_explain = node["营养说明"].InnerText;                }                BaseBeverage beverage = BeverageFactory.CreatBeverage(type,                    node["名称"].InnerText,                    (BeverageType)Enum.Parse(typeof(BeverageType), node["类型"].InnerText),                    Convert.ToDouble(node["单价"].InnerText),                     node["产地"].InnerText,                     Convert.ToDouble(node["容量"].InnerText),                     Convert.ToInt32(node["库存"].InnerText),                     alimentation_explain);                BeverageList.Add(beverage);            }        }    }}


XML文件内容如下

<?xml version="1.0" encoding="utf-8"?><商品信息>  <饮料 Type="Base">    <名称>一统绿茶</名称>    <类型>低糖</类型>    <单价>3.5</单价>    <产地>一统公司</产地>    <容量>1.25</容量>    <库存>5</库存>      </饮料>  <饮料 Type="Base">    <名称>乐乐可乐</名称>    <类型>碳酸</类型>    <单价>3</单价>    <产地>笑笑公司</产地>    <容量>2</容量>    <库存>3</库存>  </饮料>  <饮料 Type="Functional">    <名称>一统牛饮</名称>    <类型>功能</类型>    <单价>6</单价>    <产地>一统公司</产地>    <容量>0.35</容量>    <库存>10</库存>    <营养说明>富含多种维生素</营养说明>  </饮料></商品信息>


       5、按照下图绘制程序的主界面并完成要求的功能.

1:主界面

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 ShoppingDemo_6{    public partial class FrmBeverage : Form    {        public FrmBeverage()        {            InitializeComponent();        }        BeverageManager bm = new BeverageManager();        int index=0;        private void FrmBeverage_Load(object sender, EventArgs e)        {            binCombobox();            bm.LoadBaseBeverage();            BinTreeView();        }        /// <summary>        /// 绑定combobox        /// </summary>        private void binCombobox()        {            cboBeverageType.DataSource = Enum.GetValues(typeof(BeverageType));        }        /// <summary>        /// 将数据绑定到treeview上        /// </summary>        private void BinTreeView()        {            TreeNode node = new TreeNode();            node.Text = "饮料";            this.tvBeverage.Nodes.Add(node);            foreach (BaseBeverage item in bm.BeverageList)            {                node.Nodes.Add(item.ShoppingName);            }        }        private void tvBeverage_AfterSelect(object sender, TreeViewEventArgs e)        {            if (this.tvBeverage.SelectedNode.Level == 0)            {                return;            }            index = this.tvBeverage.SelectedNode.Index;            BinText(index);        }        /// <summary>        /// 在文本框显示数据        /// </summary>        /// <param name="index"></param>        private void BinText(int index)        {            BaseBeverage bb = bm.BeverageList[index];            string alimentation_explain = "无";            if (bb is FunctionalBeverage)            {                alimentation_explain = ((FunctionalBeverage)bb).Alimentation_explain;            }            txtShoppingName.Text = bb.ShoppingName;            txtAlimentation_explain.Text = alimentation_explain;            txtCapacity.Text = bb.Capacity.ToString();            txtProducing_area.Text = bb.Producing_area;            txtStock_amount.Text = bb.Stock_amount.ToString();            txtUnit_price.Text = bb.Unit_price.ToString();            cboBeverageType.Text = bb.BeverageType.ToString();        }        /// <summary>        /// 4个按钮共用的单击事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void LoadText(object sender, EventArgs e)        {            Button btn = (Button)sender;            string str = btn.Text;            switch (str)            {                case "首条":                    index = 0;                    break;                case "前条":                    index = index == 0 ? 0 : --index;                    break;                case "后条":                    index = index == bm.BeverageList.Count - 1 ? bm.BeverageList.Count - 1 : ++index;                    break;                case "尾条":                    index = bm.BeverageList.Count - 1;                    break;            }            BinText(index);        }        private void btnExit_Click(object sender, EventArgs e)        {            DialogResult dr = MessageBox.Show("确定退出吗?","退出提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);            if (dr==DialogResult.OK)            {                Application.Exit();            }        }        /// <summary>        /// 打印按钮        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnPrint_Click(object sender, EventArgs e)        {            BaseBeverage bb = bm.BeverageList[index];            if (bb is FunctionalBeverage)            {                bb = (FunctionalBeverage)bb;            }            bb.Print();        }    }}

       要求:(1)载入时初始化饮料数据(参照表格中的数据);

               2)根据初始化的数据填充树控件,并显示如上图的效果;

            3)完成点击树中节点显示详细信息的功能,当为功能饮料时,要显示营养成份

【注:购买信息部分不需要完成】