昨天发布了总结项目的第一篇,需求分析以及类的搭建,今天继续更新,动态绘制控件、票类型的切换以及数据在窗体中的展现。

先从简单的开始,票类型的切换。

分析:

  1.当点击普通票时 学生折扣和赠送者是禁用的

  2.点击赠票时 启用赠送者,禁用学生折扣

  3.点击学生票时 启用学生折扣,禁用赠送者

    学生折扣ComboBox下拉框可以选择折扣,根据折扣实时折扣计算价格到优惠价上。

  需要注意的是:

    如果没有选择ListView的电影场次(也就是时间),选择赠票和学生票是没有意义的甚至会引发学生票实时计算时的异常,所以我们要判断

  

1 if (this.treeView1.SelectedNode == null) return;

因此我们便可以设计三个RadioButton的点击事件代码

1 private void rdoGiveTicket_CheckedChanged(object sender, EventArgs e)
2  { 3 if (this.treeView1.SelectedNode == null) return; 4 this.lblOriginalPrice.Text = "0"; 5 this.cboDiscount.Enabled = false; 6 this.txtGiver.Enabled = true; 7 }

赠票点击

1 private void rdoStuTicket_CheckedChanged(object sender, EventArgs e)
2  { 3 if (this.treeView1.SelectedNode == null) return; 4 this.cboDiscount.Enabled = true; 5 this.txtGiver.Enabled = false; 6 }

学生票点击

1 private void rdoNormal_CheckedChanged(object sender, EventArgs e)
2         {
3             this.cboDiscount.Enabled = false;
4             this.txtGiver.Enabled = false;
5             if (!GetKey()) return;
6             //更新原价,因为点击赠票时价格为0了
7             this.lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString();
8         }

普通票点击

为了美观也可以调用ClearContent()方法清空一下可能残留的信息

 private void ClearContent(){//点击时间(场次)时切换回普通票 并清空可能残留的信息txtGiver.Text = "";cboDiscount.Text = "";}

由于普通票切换回来的时候需要刷新价格,所以要获取价格;cinema电影院对象是一个全局对象(可以看上一篇的类),key是一个全局的变量,存储的是选中场次的时间,用来做放映场次的Key。GetKey()方法是获取选中场次的时间并返回布尔值,看代码实例

 1 public bool GetKey()
 2         {
 3             //选中节点
 4             TreeNode node = this.treeView1.SelectedNode;
 5             //如果没有选择节点=》结束
 6             if (node == null) return false;
 7             //如果选中节点不是场次(时间)=》结束
 8             if (node.Level != 1) return false;
 9             //获取时间作为key
10             key = node.Text;
11             if (key != "" && key != null) return true;
12             return false;
13         }

GetKey方法

然后就是将XML中的数据绑定TreeView并在选择TreeView的时间节点是将影片信息展现在窗体中

之前在搭建类的时候用到 Schedule 放映计划类有一个方法LoadItems()就是将XML信息解析并添加到放映计划集合中

提取出InitTreeView()方便更新时调用

cinema.Schedule.LoadItems();放到窗体的加载事件或初始化中

 1 private void InitTreeView()
 2         {
 3             this.treeView1.Nodes.Clear();
 4             string movieName = "";
 5             TreeNode tn = null;
 6             foreach (ScheduleItem item in cinema.Schedule.Items.Values)
 7             {
 8                 //如果不存在此电影节点,创建电影节点
 9                 if (item.Movie.MovieName != movieName)
10                 {
11                     tn = new TreeNode(item.Movie.MovieName);
12                     tn.Tag = item.Movie;
13                     this.treeView1.Nodes.Add(tn);
14                 }
15                 //增加场次时间节点
16                 TreeNode time = new TreeNode(item.Time);
17                 tn.Nodes.Add(time);
18                 //获取当前场次的电影名字,重新遍历
19                 movieName = item.Movie.MovieName;
20             }
21             //展开所有的节点
22             this.treeView1.ExpandAll();
23         }

InitTreeView绑定到TreeView

接下来就是选中场次节点时将电影的详细信息展现在窗体中

 1  private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
 2         {
 3             //清空残留信息
 4             ClearContent();
 5             rdoNormal.Checked = true;
 6             //获取key
 7             if (!GetKey()) return;
 8             lblName.Text = cinema.Schedule.Items[key].Movie.MovieName;
 9             lblDate.Text = key;
10             lblType.Text = cinema.Schedule.Items[key].Movie.MovieType.ToString();
11             lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString();
12             lblMainAct.Text = cinema.Schedule.Items[key].Movie.Actor;
13             lblDirect.Text = cinema.Schedule.Items[key].Movie.Director;
14             this.pictureBox1.Image = Image.FromFile(cinema.Schedule.Items[key].Movie.Poster);
15             this.lblPreferentialPrice.Text = "";
16         }

展示详细的信息到窗体

最后是将座位信息以label标签的形式动态绘制到窗体里,这里也是最难的地方,参考了一下书

 1  private void InitialSeat()
 2         {
 3             int seatRow = 7;
 4             int seatLine = 5;
 5             for (int i = 0; i < seatRow; i++)//列
 6             {
 7                 for (int j = 0; j < seatLine; j++)//行
 8                 {
 9                     label = new Label();
10                     //设置背景颜色
11                     label.BackColor = Color.Yellow;
12                     //设置字体 字体,大小,指定应用到文本的字形信息为普通文本,指定给定数据的度量单位,新字体的GDI字符集
13                     label.Font = new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
14                     //取消自动尺寸方便我们设置尺寸
15                     label.AutoSize = false;
16                     //指定label的宽和高
17                     label.Size = new System.Drawing.Size(50, 25);
18                     //设置座位号
19                     label.Text = (j + 1).ToString() + "-" + (i + 1).ToString();
20                     label.TextAlign = ContentAlignment.MiddleCenter;
21                     //设置位置
22                     label.Location = new Point(60 + (i * 100), 60 + (j * 60));
23                     //所有的标签绑定到同一事件,lblSeat_Click是我们手动写的事件
24                     label.Click += new System.EventHandler(lblSeat_Click);
25                     //tb是TabPage
26                     tb.Controls.Add(label);
27                     //加入到全局的labels集合中
28                     labels.Add(label.Text, label);
29                     //实例化一个座位Seat构造函数的参数为座位号及颜色
30                     seat = new Seat((j + 1).ToString() + "-" + (i + 1).ToString(), Color.Yellow);
31                     cinema.Seats.Add(seat.SeatNum, seat);
32                 }
33             }

动态绘制控件

明天将会继续更新:购票、座位颜色状态的改变及场次座位状态的显示

欢迎大神斧正教导

转载于:https://www.cnblogs.com/AIThink/p/4937713.html

C#总结项目《影院售票系统》编写总结二相关推荐

  1. C#窗体项目————影院售票系统

    影院售票系统(一) 现在学习到了C#的最后一本书,有一个窗体的结业案例. 先上图 运行起来是这样的 点击座位号弹出是否购票 买了之后座位变红色 对于老手来说可能so easy:但对我这菜鸟来说有点复杂 ...

  2. Jsp实现在线影院售票系统

    此系统以MyEclipse作为前台开发工具和MySQL这款强大的数据库专业软件做后台数据库的设计,整个系统用简洁明快的界面展现出来,使操作简单可行,用户使用方便.简洁.本系统采用当今社会比较先进的SS ...

  3. Oracle影院订票系统,C#实现影院售票系统

    本文实例为大家分享了C#实现影院售票系统的具体代码,供大家参考,具体内容如下 本人认为此项目的难点有4点 1.首先是将解析完的XML文件绑定到TreeView上 2.用代码动态生成座位的label,生 ...

  4. (附源码)计算机毕业设计SSM影院售票系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  5. [附源码]java毕业设计影院售票系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. 基于node.js和vue的前后端分离影院售票系统电影院影片管理

    1,项目介绍 基于 node.js和vue 的影院售票系统拥有两种角色,分别为管理员和用户. 用户:热映.即将上映.电影和影院全局搜索.评论.选座.购票.点赞.收藏.订单等一系列购票功能 管理员:用户 ...

  7. asp.net影院售票系统

    编号:646 随着时代的发展,人们在茶前饭后通常会到电影院看最新的影片信息,丰富自己的业余生活.传统的影院订票都是到电影院之后进行购票,但是通常情况下我们不知道影院是否已经满座,我们是否能够顺利的拿到 ...

  8. 影院售票系统java和数据库_影院售票管理系统的设计与实现(SSH,SQLServer)(含录像)...

    影院售票管理系统的设计与实现(SSH,SQLServer)(含录像)(毕业论文15900字,程序代码,SQLServer数据库) 本毕业设计的内容,阐述了实现整个电影票预订系统功能的系统.从实现电影票 ...

  9. java 影院售票系统_java电影院售票系统

    [实例简介] 有简单界面的电影院售票系统,功能有用XML存储电影资源,把已售的电影票信息保存到txt文件中,再以电影票的形式打印到txt文件中. [实例截图] [核心代码] saletickt_sys ...

最新文章

  1. Debian/Ubuntu/Centos下编译安装RocksDB
  2. [flask实践] 解决mysql数据库不支持中文的问题
  3. Postfix 配置参数速查
  4. 计算机网络(谢希仁第八版)第一章:概述
  5. html请求接口_软件测试学习教程——LoadRunner实现接口测试
  6. php实现凯撒密码加密算法,Python实现的凯撒密码算法示例
  7. 来学习几个简单的Hive函数啦
  8. ncurses键盘管理:cbreak,keypad,getch(),KEY_F(),clrtoeol()
  9. 如何设置任务栏和开始菜单属性中的 分组相似任务栏按钮 的个数
  10. 桥接设计模式(Bridge)
  11. Java推断文本文件编码格式以及读取
  12. AcWing 1813. 方块游戏(暴力枚举)
  13. 你们真的会追汉纸么?!
  14. 1078 Hashing (25 分) 解决冲突采用正向增加的二次探查法
  15. c语言汉字转拼音,c语言汉字转拼音函数源码
  16. 大学计算机excel高级筛选,excel高级筛选的使用方法(入门 进阶 高级)
  17. Web应用实例:音频可视化
  18. 基于java的文章发布系统_基于JavaSSH的文章发布系统的设计任务书
  19. 微信公众号接入智能客服机器人可以实现哪些效果
  20. ipython怎么念_如何读取IPython%prun(profiler)命令的输出? - python

热门文章

  1. python3将列表当做堆栈使用
  2. Linux vim多文件切换
  3. idea设置启动时打开欢迎页
  4. POI批量导入及一键上传ocupload和pinyin4j组件的使用案例
  5. 2018android wear手表,谷歌正开发三款智能手表 Wear OS系统逐步脱离Android范畴
  6. 常见的html行级元素及语义,HTML入门之——结构,常用标签及其属性,再加上语义化...
  7. 静态资源跨域解决方案
  8. WIFI网络,两台笔记本互联Oracle,一台是11g,一台是12c
  9. 4.1.4 OS之文件的物理结构(连续分配、链接分配[隐式-显式]、索引分配[链接方案-多层索引-混合索引])
  10. 安装jdk配置环境、cmd命令行测试环境变量配置是否正确及运行java程序、安装IDEA编写代码测试