题目:饮料代理公司商品预定管理
某公司为实现所售商品的有效管理,更好的为客户提供服务,拟定制作一套进销存软件,本例只实现其中的商品预定功能和定单打印,所商品信息如下:
商品名称 ShoppingName | 类型 BeverageType | 单价 Unit_price | 产地 Producing_area | 营养说明 | 库存数量 Stock_amount | 容量(升) Capacity |
一统绿茶 | 低糖 | 3.5 | 一统公司 |
| 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)完成点击树中节点显示详细信息的功能,当为功能饮料时,要显示营养成份
【注:购买信息部分不需要完成】