7.3 点菜模块实现过程
本模块使用的数据表:tb_food、tb_Waiter、tb_Room、tb_GuestFood 点菜模块的具体实现步骤如下:
(1)新建一个Windows窗体,命名为frmDC.cs,主要用于实现系统的点菜功能。该窗体用到的主要控件如表12所示。
(2)首先建立一个公共变量RName,用于接收指定桌台的名称。关键代码如下: 例程26 代码位置:光盘\\ TM \\06\\ MrCy \\frmDC.cs public string RName;
(3)在窗体加载时,程序首先从数据库中检索出所有的菜系名称并显示在TreeView控件上,以便用户选择。关键代码如下:
例程27 代码位置:光盘\\ TM \\06\\ MrCy \\frmDC.cs
private void frmDC_Load(object sender, EventArgs e) {
this.Text = RName + \点/加菜\设置窗体显示问题
TreeNode newnode1 = tvFood.Nodes.Add(\锅底\为控件添加节点 TreeNode newnode2 = tvFood.Nodes.Add(\配菜\ TreeNode newnode3 = tvFood.Nodes.Add(\烟酒\ TreeNode newnode4 = tvFood.Nodes.Add(\主食\
SqlConnection conn = BaseClass.DBConn.CyCon(); //连接数据库 conn.Open(); //打开数据库
SqlCommand cmd = new SqlCommand(\conn);
SqlDataReader sdr = cmd.ExecuteReader(); while (sdr.Read())
{
newnode1.Nodes.Add(sdr[3].ToString().Trim()); //为“锅底”添加子节点 }
sdr.Close();
cmd = new SqlCommand(\ sdr = cmd.ExecuteReader(); while (sdr.Read()) {
newnode2.Nodes.Add(sdr[3].ToString().Trim()); //为“配菜”添加子节点 }
sdr.Close();
cmd = new SqlCommand(\ sdr = cmd.ExecuteReader(); while (sdr.Read()) {
newnode3.Nodes.Add(sdr[3].ToString().Trim()); //为“烟酒”添加子节点 }
sdr.Close();
cmd = new SqlCommand(\ sdr = cmd.ExecuteReader(); while (sdr.Read()) {
newnode4.Nodes.Add(sdr[3].ToString().Trim()); //添加子节点 }
sdr.Close();
cmd = new SqlCommand(\ sdr = cmd.ExecuteReader(); while (sdr.Read()) {
//为“主食”添加子节点
cbWaiter.Items.Add(sdr[\
} cbWaiter.SelectedIndex = 0; sdr.Close();
cmd = new SqlCommand(\RoomZT from tb_Room where RoomName='\
string zt = Convert.ToString(cmd.ExecuteScalar()); //获取桌台状态 if (zt.Trim() == \待用\如果处在“待用”状态,则禁用所有操作 {
groupBox1.Enabled = false; groupBox2.Enabled = false; groupBox3.Enabled = false; groupBox4.Enabled = false; }
conn.Close(); //关闭连接 GetData(); //重新绑定数据
tvFood.ExpandAll(); //展开TreeView控件 }
(4)当用户双击某个菜系时,将在右侧显示该菜系的详细信息,以便用户能够准确地选择。关键代码如下:
例程28 代码位置:光盘\\ TM \\06\\ MrCy \\frmDC.cs
private void treeView1_DoubleClick(object sender, EventArgs e) {
string foodname = tvFood.SelectedNode.Text; //获取选择的商品名称
if (foodname == \锅底\|| foodname == \配菜\|| foodname == \烟酒\|| foodname == \主食\
{} //如果选择的文本为以上这几项则不执行任何操作 else {
SqlConnection conn = BaseClass.DBConn.CyCon(); //连接数据库 conn.Open(); //打开连接
SqlCommand cmd = new SqlCommand(\* from tb_food where foodname='\+ foodname + \
SqlDataReader sdr = cmd.ExecuteReader(); sdr.Read();
txtNum.Text = sdr[\读取商品的编号 txtName.Text = foodname; //显示商品的名称
txtprice.Text = sdr[\读取商品的单价 conn.Close(); //关闭连接
if (txtpnum.Text == \判断消费商品数量是否为空 {
MessageBox.Show(\数量不能为空\
return; } else {
//根据消费商品的数量计算出消费商品的价格
txtallprice.Text = Convert.ToString(Convert.ToInt32(txtprice.Text) * Conve2(txtpnum.Text));
} } }
(5)为了保证消费商品数量文本框中的数据必须为数字,在文本框的KeyPress事件中添加代码控制输入数据的类型。关键代码如下:
例程29 代码位置:光盘\\ TM \\06\\ MrCy \\frmDC.cs
private void txtpnum_KeyPress(object sender, KeyPressEventArgs e) {
//判断是否输入了数字
if ((e.KeyChar != 8 && !char.IsDigit(e.KeyChar)) && e.KeyChar != 13) {
MessageBox.Show(\请输入数字\ e.Handled = true; } }
(6)当用户更改消费商品的数量时,该商品的总价格会随之改变,实现的方法是在 TextBox控件的TextChanged事件中添加代码。关键代码如下:
例程30 代码位置:光盘\\ TM \\06\\ MrCy \\frmDC.cs
private void txtpnum_TextChanged(object sender, EventArgs e) {
if (txtpnum.Text == \判断消费商品数量是否为空 {
MessageBox.Show(\数量不能为空\ return; } else {
if (Convert.ToInt32(txtpnum.Text) < 1) //判断消费商品数量输入是否正确 {
MessageBox.Show(\不能为小于1的数字\ return; } else {
//根据消费商品的数量计算出消费商品的价格
txtallprice.Text = Convert.ToString(Convert.ToInt32(txtprice.Text) * Conve2(txtpnum.Text)); } } }
(7)自定义一个GetData方法,用于显示所有的点菜信息。关键代码如下: 例程31 代码位置:光盘\\ TM \\06\\ MrCy \\frmDC.cs
private void GetData() //自定义的方法用于显示所有点菜信息 {
SqlConnection conn = BaseClass.DBConn.CyCon(); //连接数据库 SqlDataAdapter sda = new SqlDataAdapter(\foodnum,foodallprice,waitername,beizhu,zhuotai,datatime from tb_GuestFood where zhuotai='\ DataSet ds = new DataSet(); sda.Fill(ds);
dgvFoods.DataSource = ds.Tables[0]; //对控件进行数据绑定 }
(8)当点菜完毕后,单击“保存”按钮可以对顾客消费的菜系进行保存,以便在结账时
相关推荐: