昨天总结了动态绘制控件、票类型的切换以及数据在窗体中的展现。今天继续总结,自己喜欢的就去做吧,让别人说去吧,省的自己再留下什么后悔遗憾,噢耶,加油!
今天总结项目中最核心的部分--购票、座位颜色状态的改变及场次座位状态的显示。
分析:
1.在选中时间(场次)后更新出座位状态(label实现),售出的为红色,未售出的显示为黄色。
2.已售出提示已经售出并不进行任何操作,未售出的询问是否购买。
3.根据选择的是普通票、赠票、还是学生票分别创建不同的票对象
如果选择赠票则需要检测赠送者否填写
如果选择的是学生票需要检测折扣是否选择
4.获取选中座位的座位号,调用工具类的CreateTicket()方法创建对应选中类型的票,普通票则直接使用Ticket类创建
5.用户选择购买后将座位集合的颜色改成红色;重新使用票类的计算价格方法;将售出的票加入到Cinema类中的SoldTickets集合中;更新座位颜色状态,上代码详解
1 try 2 { 3 //获取当前被点击座位标签的座位号(Text属性) 4 string seatNum = ((Label)sender).Text.ToString(); 5 //赠送者名字 6 string customerName = this.txtGiver.Text.ToString(); 7 //折扣 8 int discount = 0; 9 //票的类型10 string type = "";11 //如果学生票是选中的12 if (this.rdoStuTicket.Checked)13 {14 type = "StudentTicket";15 if (this.cboDiscount.Text == null)16 {17 MessageBox.Show("请输入折扣数!", "提示");18 return;19 }20 else21 {22 discount = int.Parse(this.cboDiscount.Text);23 }24 }25 //如果赠票是选中的26 else if (this.rdoGiveTicket.Checked)27 {28 if (string.IsNullOrEmpty(this.txtGiver.Text))29 {30 MessageBox.Show("请输入赠票者姓名!", "提示");31 return;32 }33 type = "FreeTicket";34 }35 //创建票 使用工具类的静态方法36 Ticket newTicket = TicketUtil.CreateTicket(cinema.Schedule.Items[key], cinema.Seats[seatNum], discount, customerName, type);37 //如果当前座位的颜色是黄色-待售出38 if (cinema.Seats[seatNum].Color == Color.Yellow)39 {40 //询问41 DialogResult result = MessageBox.Show("是否购买?", "提示", MessageBoxButtons.YesNo);42 if (result == DialogResult.Yes)43 {44 //重新计算票价45 newTicket.CalcPrice();46 //将票加入到已经售出票的集合47 cinema.SoldTickets.Add(newTicket);48 //更新座位颜色状态49 UpdateSeat();50 lblPreferentialPrice.Text = newTicket.Price.ToString();51 newTicket.Print();52 //使座位集合的颜色状态改变53 cinema.Seats[seatNum].Color = Color.Red;54 }55 }56 //如果是已经售出的票57 else58 {59 //显示当前售票信息60 foreach (Ticket ticket0 in cinema.SoldTickets)61 {62 //已售出票集合的座位号等于当前点击座位号 并且 选中的时间等于售出票的场次的时间 并且 售出票的场次计划中电影名字等于TreeView选中时间的父节点也就是电影名称63 if (ticket0.Seat.SeatNum == seatNum && ticket0.ScheduItem.Time == treeView1.SelectedNode.Text && ticket0.ScheduItem.Movie.MovieName == treeView1.SelectedNode.Parent.Text)64 {65 ticket0.Show();66 }67 }68 }69 70 }71 catch (Exception ex)72 {73 MessageBox.Show("请先选择场次!" + ex.Message);74 }
这里面需要调用座位颜色更新的一个方法UpdateSeat(),先将Seats集合和labels集合的颜色初始化,也就是重置颜色为黄色,再根据售出票集合的信息将售出座位的颜色置为红色
1 //重置labels集合label的颜色 2 foreach (string lkey in labels.Keys) 3 { 4 labels[lkey].BackColor = Color.Yellow; 5 } 6 //重置座位集合颜色 7 foreach (string key in cinema.Seats.Keys) 8 { 9 cinema.Seats[key].Color = Color.Yellow;10 }11 //遍历售出票集合12 foreach (Ticket ticket in cinema.SoldTickets)13 {14 //如果场次一致,并且电影名字一致15 if (ticket.ScheduItem.Time == this.treeView1.SelectedNode.Text && ticket.ScheduItem.Movie.MovieName == this.lblName.Text)16 {17 //重新更改颜色18 labels[ticket.Seat.SeatNum].BackColor = Color.Red;19 cinema.Seats[ticket.Seat.SeatNum].Color = Color.Red;20 }21 }
这样就实现了购买票后座位颜色状态的改变。
然后再根据选中的TreeView的时间(场次)节点刷新每场的中已经售出的票。
就是之前第二篇的treeView1_AfterSelect这个事件,调用我们的UpdateSeat方法就行了,这样每选择一个场次就会更新一次座位售出情况。
今天就到这了,明天继续实现对销售信息的本地保存、以及每次打开时载入上次的保存的销售信息,并对整个项目做整体总结。
【来自 乐智的菜园子: 亲们,码字不容易,转载请注明出处。】