C#总结项目《影院售票系统》编写总结二
昨天发布了总结项目的第一篇,需求分析以及类的搭建,今天继续更新,动态绘制控件、票类型的切换以及数据在窗体中的展现。
先从简单的开始,票类型的切换。
分析:
1.当点击普通票时 学生折扣和赠送者是禁用的
2.点击赠票时 启用赠送者,禁用学生折扣
3.点击学生票时 启用学生折扣,禁用赠送者
学生折扣ComboBox下拉框可以选择折扣,根据折扣实时折扣计算价格到优惠价上。
需要注意的是:
如果没有选择ListView的电影场次(也就是时间),选择赠票和学生票是没有意义的甚至会引发学生票实时计算时的异常,所以我们要判断
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 }
学生票点击
private void rdoNormal_CheckedChanged(object sender, EventArgs e)
{
this.cboDiscount.Enabled = false;
this.txtGiver.Enabled = false;
if (!GetKey()) return;
//更新原价,因为点击赠票时价格为0了
this.lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString();
}
普通票点击
为了美观也可以调用ClearContent()方法清空一下可能残留的信息
private void ClearContent()
{
//点击时间(场次)时切换回普通票 并清空可能残留的信息
txtGiver.Text = "";
cboDiscount.Text = "";
}
由于普通票切换回来的时候需要刷新价格,所以要获取价格;cinema电影院对象是一个全局对象(可以看上一篇的类),key是一个全局的变量,存储的是选中场次的时间,用来做放映场次的Key。GetKey()方法是获取选中场次的时间并返回布尔值,看代码实例
public bool GetKey()
{
//选中节点
TreeNode node = this.treeView1.SelectedNode;
//如果没有选择节点=》结束
if (node == null) return false;
//如果选中节点不是场次(时间)=》结束
if (node.Level != ) return false;
//获取时间作为key
key = node.Text;
if (key != "" && key != null) return true;
return false;
}
GetKey方法
然后就是将XML中的数据绑定TreeView并在选择TreeView的时间节点是将影片信息展现在窗体中
之前在搭建类的时候用到 Schedule 放映计划类有一个方法LoadItems()就是将XML信息解析并添加到放映计划集合中
提取出InitTreeView()方便更新时调用
cinema.Schedule.LoadItems();放到窗体的加载事件或初始化中
private void InitTreeView()
{
this.treeView1.Nodes.Clear();
string movieName = "";
TreeNode tn = null;
foreach (ScheduleItem item in cinema.Schedule.Items.Values)
{
//如果不存在此电影节点,创建电影节点
if (item.Movie.MovieName != movieName)
{
tn = new TreeNode(item.Movie.MovieName);
tn.Tag = item.Movie;
this.treeView1.Nodes.Add(tn);
}
//增加场次时间节点
TreeNode time = new TreeNode(item.Time);
tn.Nodes.Add(time);
//获取当前场次的电影名字,重新遍历
movieName = item.Movie.MovieName;
}
//展开所有的节点
this.treeView1.ExpandAll();
}
InitTreeView绑定到TreeView
接下来就是选中场次节点时将电影的详细信息展现在窗体中
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
//清空残留信息
ClearContent();
rdoNormal.Checked = true;
//获取key
if (!GetKey()) return;
lblName.Text = cinema.Schedule.Items[key].Movie.MovieName;
lblDate.Text = key;
lblType.Text = cinema.Schedule.Items[key].Movie.MovieType.ToString();
lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString();
lblMainAct.Text = cinema.Schedule.Items[key].Movie.Actor;
lblDirect.Text = cinema.Schedule.Items[key].Movie.Director;
this.pictureBox1.Image = Image.FromFile(cinema.Schedule.Items[key].Movie.Poster);
this.lblPreferentialPrice.Text = "";
}
展示详细的信息到窗体
最后是将座位信息以label标签的形式动态绘制到窗体里,这里也是最难的地方,参考了一下书
private void InitialSeat()
{
int seatRow = ;
int seatLine = ;
for (int i = ; i < seatRow; i++)//列
{
for (int j = ; j < seatLine; j++)//行
{
label = new Label();
//设置背景颜色
label.BackColor = Color.Yellow;
//设置字体 字体,大小,指定应用到文本的字形信息为普通文本,指定给定数据的度量单位,新字体的GDI字符集
label.Font = new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)()));
//取消自动尺寸方便我们设置尺寸
label.AutoSize = false;
//指定label的宽和高
label.Size = new System.Drawing.Size(, );
//设置座位号
label.Text = (j + ).ToString() + "-" + (i + ).ToString();
label.TextAlign = ContentAlignment.MiddleCenter;
//设置位置
label.Location = new Point( + (i * ), + (j * ));
//所有的标签绑定到同一事件,lblSeat_Click是我们手动写的事件
label.Click += new System.EventHandler(lblSeat_Click);
//tb是TabPage
tb.Controls.Add(label);
//加入到全局的labels集合中
labels.Add(label.Text, label);
//实例化一个座位Seat构造函数的参数为座位号及颜色
seat = new Seat((j + ).ToString() + "-" + (i + ).ToString(), Color.Yellow);
cinema.Seats.Add(seat.SeatNum, seat);
}
}
动态绘制控件
明天将会继续更新:购票、座位颜色状态的改变及场次座位状态的显示
欢迎大神斧正教导
C#总结项目《影院售票系统》编写总结二的更多相关文章
- C#总结项目《影院售票系统》编写总结一
C#学习经历从基本语法结构到窗体再到面向对象终于走完了.NET初级程序员的道路,做为品德优良好学生更不能落下课程的总结项目-某某鸟<影院售票系统>.用了大概一天半的时间做完这个练手项目,先 ...
- C#编写影院售票系统(A project with a higher amount of gold )
项目需求: 影院售票系统 1.基础设施 放映厅 座位集合 2.一个海报------------>放映计划 3.售票设置----------->观影 领域模型:程序中提炼出的实体 4.从电影 ...
- C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)
此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html 项目类图: 影院类: using Sy ...
- 「影院售票系统」 · Java Swing + MySQL JDBC开发
目录 文档说明: 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 实现代码: 一.数据库: 二.Java Swing: com.ynavc.Bea ...
- C#总结项目《影院售票系统》编写总结完结篇
回顾:昨天总结了影院售票系统核心部分-售票,整个项目也就完成了2/3了,需求中也要求了对销售信息的保存,今天就继续总结销售信息的保存以及加载销售信息. 分析:退出程序时将已售出票集合中的对象循环写入到 ...
- C#总结项目《影院售票系统》编写总结三
昨天总结了动态绘制控件.票类型的切换以及数据在窗体中的展现.今天继续总结,自己喜欢的就去做吧,让别人说去吧,省的自己再留下什么后悔遗憾,噢耶,加油! 今天总结项目中最核心的部分--购票.座位颜色状态的 ...
- 《MySQL数据操作与查询》- 综合项目 - 航空售票系统
Mysql & SqlServer综合项目需求 1.系统整体功能 系统需支持以下功能: 维护客户信息.航班信息和票务信息 支持客户按多种条件组合查询航班信息和票务信息 支持客户根据票务信息订购 ...
- 努力做一个优秀的programmer [ C# 影院售票系统]
Cinema.cs类 [Serializable] // 电影院类 public class Cinema { public Cinema() { //二进制 SoldTickets = new Li ...
- 浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 三年多前还在上研时,用C#+反射机制写过插件系统,后来又用M ...
随机推荐
- js关于DOM和BOM
关于BOM和DOM BOM 下面一幅图很好的说明了BOM和DOM的关系 BOM提供了一些访问窗口对象的一些方法,我们可以用它来移动窗口位置,改变窗口大小,打开新窗口和关闭窗口,弹出对话框,进行导航以及 ...
- phpcms首页商机的调用,多种方式
<hr /> {pc:get sql="select * from phpcms_yp_buy" order="updatetime DESC"} ...
- oracle创建表空间、用户、用户授权、删除表空间、删除用户
--创建临时表空间 create temporary tablespace test_temp --test_temp表空间名称 tempfile 'E:\oracle\product\10.2.0\ ...
- C++ 性能剖析 (一)
C++ 性能剖析 (一) 性能问题也不是仅仅用“技术”可以解决的,它往往是架构,测试,假设等综合难题.不过,对于一个工程师来说,必须从小做起,把一些“明显”的小问题解决.否则的话积小成多,千里堤坝,溃 ...
- Samba 服务器介绍
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通 ...
- JavaScript学习 常用的对话框函数
JavaScript提供了三个很不错的对话框函数,使用这三个函数可以很方便的显示一个对话框: 一.alert(); <script type="text/javascript" ...
- 实验七:Linux内核如何装载和启动一个可执行程序
原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 题目自拟,内容围绕对Linu ...
- 防止SQL注入攻击,数据库操作类
如果不规避,在黑窗口里面输入内容时利用拼接语句可以对数据进行攻击 如:输入Code值 p001' union select * from Info where '1'='1 //这样可以查询到所有数据 ...
- Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备
本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...
- java正则表达式一:基本使用
java正则表达式主要涉及三个类:java.util.regex.Matcher.java.util.regex.Pattern.java.util.regex.PatternSyntaxExcept ...