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

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

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

分析:

  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             }

动态绘制控件

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

欢迎大神斧正教导

时间: 2024-10-11 23:57:59

C#总结项目《影院售票系统》编写总结二的相关文章

C#总结项目《影院售票系统》编写总结一

C#学习经历从基本语法结构到窗体再到面向对象终于走完了.NET初级程序员的道路,做为品德优良好学生更不能落下课程的总结项目-某某鸟<影院售票系统>.用了大概一天半的时间做完这个练手项目,先上效果截图一张 抽出时间做些这个对目前的我来说算不小的项目. 用到的知识点有:面向对象思想.TreeView.XML读取.File文件流.泛型集合,这里面对我来说难度最大的是面向对象与泛型集合的结合,看来学习一门编程语言的难点还是在设计思想上. 再来介绍一下项目需求:在影片列表中选择某个时段的一场电影,单击座

影院售票系统-----一个让你有成就感的小项目,只有一丢丢哦

先来点废话,刚拿到这个项目的时候你是怎么想的,上来就闷头写,还是构想思路......   项目需求:     影院售票系统可以销售每天不同时段的电影票,不同时段的电影票有不同的优惠政策,还有使用兑换券的免费票.选择某个时段的一场电影,     单击放映厅未售出的座位并选择一个种类的电影票,创建电影票,计算价格并打印,座位设置为红色表示已经售出.   思想:    使用面向对象思想编写影院售票系统   看完这个你有没有点思路呢,我想你是有的 ...... 下面先来点图片,先刺激一下视觉:  窗体搭

影院售票系统

这个影院售票的项目比较的复杂,共需要九个类. No.1首先第一个类,座位类.该项目的座位默认为黄色,被售出的状态下默认为红色.需要导入命名空间 Using.System.Drawing.Color public class Seat { public Color Color { get; set; }//座位颜色 public string Num { get; set; }//座位号 public Seat() { } public Seat(Color color,string num) {

C#总结项目《影院售票系统》编写总结三

昨天总结了动态绘制控件.票类型的切换以及数据在窗体中的展现.今天继续总结,自己喜欢的就去做吧,让别人说去吧,省的自己再留下什么后悔遗憾,噢耶,加油! 今天总结项目中最核心的部分--购票.座位颜色状态的改变及场次座位状态的显示. 分析: 1.在选中时间(场次)后更新出座位状态(label实现),售出的为红色,未售出的显示为黄色. 2.已售出提示已经售出并不进行任何操作,未售出的询问是否购买. 3.根据选择的是普通票.赠票.还是学生票分别创建不同的票对象 如果选择赠票则需要检测赠送者否填写 如果选择

火车票售票系统需求分析

火车票售票系统 需求分析报告 1.引言 (1)1.1编写目的 (1)1.2项目背景 (2)1.3定义 (2)1.4参考资料 (2)2.任务概述 (2)2.1目标 (2)2.2运行环境 (3)2.3条件与限制 (3)3.数据描述 (3)3.1静态数据 (3)3.2动态数据 (3)3.3数据库介绍 (4)3.4数据词典 (4)3.5数据采集 (8)4.功能需求 (8)4.1功能划分 (8)4.2功能描述 (9)5.性能需求 (9)5.1数据精确度 (9)5.2时间特性 (9)5.3适应性 (9)6.

WEB项目(B/S系统)打包安装(总结篇)

原文:WEB项目(B/S系统)打包安装(总结篇) 打包安装程序的制作选择性还很多的,有installshield,wise installer,inno setup这几个做打包安装项目都是很强大的,要搞出界面大气个性化的安装,还是得用这几个才行,我这篇说的是.NET自带的安装项目打包WEB系统的,.NET打包安装项目虽然傻傻的,也比较丑,但是搭建安装项目快速也能满足总体的要求,如果没有足够的时间研究重量级的安装工具,短时间内用.NET自带的安装项目也是一个良好的选择.网上有很多关于用.NET打包

浅谈C#中插件系统编写的一种简单方法

1.背景 几年前还在上学时,用C#+反射机制写过插件系统,后来又用MEF写过插件系统.插件系统本身具有易于扩展的优势,所以在实际项目中使用很频繁.即使在B/S项目中,插件的思想也是大行其道,比如前端单页面+AMD编程便可以理解为一种插件机制,以及后台扩展项目统一打包为一个jar放入主系统jar文件中一起发布,也可以理解为插件思想的运用. 这里我们回到C/S插件系统编写的问题上.由于之前诸多项目编写是将插件编译成dll,然后进行解析.这样做有其好处,即宿主中可以对各个模块解析,完成插件间.插件和主

在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore.随着Android系统逐步扩大市场占有率,终端设备的多样性亟需更多的移动开发人员的参与.据业内统计,Android研发人才缺口至少30万.目前,

干货 | C#开发的电影售票系统

01 介绍 一个有会员制的电影院购票系统.具有会员注册功能,可区分会员和散客两种身份,实现会员及折扣管理.购票具有挑选电影场次,选择座位和查看电影信息等功能. 查看电影详情.获取排片信息. 选择场次座位,完成支付,获取取票信息. 注册成为影院会员,享受优惠折扣. 代码获取 关注我们的公众号!在后台回复[CSTK]不包括[]即可获取. 02 设计思路 在功能设计上,一个电影院购票系统,首先需要具备最基础的功能:影片选择.场次选择和座位选择.在用户提交选择后,会需要支付模块提示用户付款并完成出票.为