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

本文档介绍了如何使用简单工厂模式解析XML文件,将饮料商品信息加载到ListView中。饮料类被封装为BaseBeverage,功能饮料通过继承实现。还要求创建一个BeverageManager来管理商品,利用List<BaseBeverage>存储饮料数据,并从XML文件中加载数据。程序主界面需要展示饮料树状结构,并能显示选中饮料的详细信息,特别是功能饮料的营养成分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

商品名称

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)完成点击树中节点显示详细信息的功能,当为功能饮料时,要显示营养成份

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值