Oracle影院订票系统,C#实现影院售票系统
本文实例为大家分享了C#实现影院售票系统的具体代码,供大家参考,具体内容如下
本人认为此项目的难点有4点
1.首先是将解析完的XML文件绑定到TreeView上
2.用代码动态生成座位的label,生成触发事件Label_Click,俩组放映时间的售出座位是不同的
3.用序列化与反序列化实现代码的多次利用
4.打印票务
创建与本项目相关的10个类
一、首先在放映计划类中创建LoadItems()方法来解析ShowList.xml文件
XmlDocument dic=new XmlDocument();
dic.Load("ShowList.xml");
XmlNode xml = dic.DocumentElement;
foreach (XmlNode item in xml.ChildNodes)
{
Movie movie=new Movie();
movie.MovieName = item["Name"].InnerText;
movie.Poster = item["Poster"].InnerText;
movie.Director = item["Director"].InnerText;
movie.Actor = item["Actor"].InnerText;
movie.MovieType = (MovieType)(Enum.Parse(typeof(MovieType), item["Type"].InnerText));
movie.Price = Convert.ToInt32(item["Price"].InnerText);
//因为放映时间不在电影类中,所以经过第二次遍历,找到时间,最后将所有解析完的文件添加到Dic的双列集合中
foreach (XmlNode itemm in item["Schedule"])
{
ScheduleItem scheduleItem=new ScheduleItem();
scheduleItem.Time = itemm.InnerText;
scheduleItem.Movie = movie;
Dic.Add(scheduleItem.Time, scheduleItem);
二、将座位用代码填入放映厅中
int seatRow = 6;
int seatLine = 5;
for (int i = 0; i
{
for (int j = 0; j < seatLine; j++)
{
label17 = new Label();
label17.BackColor = Color.Yellow;
label17.Font = new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, ((byte) (134)));
label17.AutoSize = false;
label17.Size = new System.Drawing.Size(50, 25);
label17.Text = (j + 1).ToString() + "-" + (i + 1).ToString();
label17.TextAlign = ContentAlignment.MiddleCenter;
label17.Location=new Point(30+(i*90),30+(j*60));
label17
.Click += new System.EventHandler(lblseat_Click);
tabPage2.Controls.Add(label17);
list.Add(label17.Text,label17);
Seat seat=new Seat((j+1).ToString()+"-"+(i+1).ToString(),Color.Yellow);
cinema.Seats.Add(seat.SeatNum,seat);
}
}
利用双循环自动生成6行5列的座位表,其中将控件的大小和颜色以及位置进行固定
三、将解析完的文件绑定到Dic的集合中后再主窗体上进行绑定TreeView
Schedule s=new Schedule();
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
string movieName = null;
TreeNode movieNode = null;
s.LoadItems();
foreach (KeyValuePair item in s.Dic)
{
if (movieName!=item.Value.Movie.MovieName)
{
movieNode=new TreeNode(item.Value.Movie.MovieName);
treeView1.Nodes.Add(movieNode);
}
TreeNode timeNode=new TreeNode(item.Value.Time);
movieNode.Nodes.Add(timeNode);
movieName = item.Value.Movie.MovieName;
}
treeView1.EndUpdate();
之后的成功如下图所示
五、完成影片详情的绑定
将TreeView上的文件信息以单机的形式绑定到详情上
foreach (KeyValuePair item in s.Dic)
{
if (treeView1.SelectedNode.Text==item.Key)
{
this.label2.Text = item.Value.Movie.MovieName;
this.label9.Text = item.Value.Movie.Director;
this.label10.Text = item.Value.Movie.Actor;
this.label11.Text = item.Value.Movie.MovieType.ToString();
this.label12.Text = item.Value.Time;
this.label13.Text = item.Value.Movie.Price.ToString();
this.pictureBox1.Image =Image.FromFile(item.Value.Movie.Poster);
this.label14.Text = "";
}
}
ClearSeat();
foreach (Ticket ticket in cinema.SoldTickets)
{
foreach (Seat seat in cinema.Seats.Values)
{
if ((ticket.ScheduleItem.Time == key) && (ticket.Seet.SeatNum == seat.SeatNum))
{
seat.Color = Color.Red;
}
}
}
UpdateSeat();
}
public void ClearSeat()
{
foreach (Seat seat in cinema.Seats.Values)
{
seat.Color = Color.Yellow;
}
}
六、选择特殊票系列特殊票分为学生票,普通票和赠票学生票类和赠票类分别继承它门的父类售票类学生票子类有独立的属性Discount(学生票折扣)赠票子类也有独立的属性CustomerName(赠送者的名字)都继承父类的票价的计算方法
当触发普通票时,折扣下拉框以及赠票者框关闭
当触发赠票时,折扣下拉框关闭,赠票者框打开
当触发学生票时,赠票者框关闭,折扣下来框打开
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
this.cmbDisCount.Enabled = false;
this.txtCustomer.Text = "";
this.txtCustomer.Enabled = false;
this.cmbDisCount.Text = "";
this.label14.Text = "";
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
this.txtCustomer.Enabled = true;
this.cmbDisCount.Enabled = false;
this.cmbDisCount.Text = "";
this.label14.Text = "0";
}
private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
this.txtCustomer.Enabled = false;
this.txtCustomer.Text = "";
this.cmbDisCount.Enabled = true;
this.cmbDisCount.Text = "7";
if (this.label13.Text!="")
{
label14.Text = (Convert.ToInt32(label13.Text) * Convert.ToInt32(cmbDisCount.Text) / 10).ToString();
}
}
七、售票售票当中我们会用到一种设计模式,工厂模式,建立工厂类
public class TicketUitl
{
public static Ticket CreateTicket(ScheduleItem item,Seat seat,string csName,double discount,string type)
{
Ticket ticket = null;
switch (type)
{
case "normal":
ticket=new Ticket(item,seat);
break;
case "free":
ticket=new FreeTicket(csName,item,seat);
break;
case "student":
ticket=new StudentTicket(discount,item,seat);
break;
}
return ticket;
}
}
在工厂类中我们以票类当作类型声明一个带参方法来判断三次不同的售票类型
之后所调用他们各子重写父类的CalcPrice()方法进行票务的结束工作
if (String.IsNullOrEmpty(this.label2.Text))
{
MessageBox.Show("您还没选好电影!", "提示");
return;
}
try
{
ticket++;
Schedule s=new Schedule();
s.LoadItems();
cinema.Schedule = s;
string time = this.treeView1.SelectedNode.Text;
ScheduleItem item = cinema.Schedule.Dic[time];
string seatNum = ((Label) sender).Text.ToString();
string customerName = this.txtCustomer.Text.ToString();
int discount = 0;
string type = "";
if (this.radioButton3.Checked)
{
type = "student";
if (this.cmbDisCount.Text == null)
{
MessageBox.Show("请输入折扣数!", "提示");
return;
}
else
{
discount = int.Parse(this.cmbDisCount.Text);
}
}
else if (this.radioButton2.Checked)
{
if (String.IsNullOrEmpty(this.txtCustomer.Text))
{
MessageBox.Show("请输入增票者姓名!", "提示");
return;
}
else
{
type = "free";
}
}
else
{
type = "normal";
}
//调用工具类创建票
Ticket newTickey = TicketUitl.CreateTicket(item, cinema.Seats[seatNum],
customerName,Convert.ToInt32(discount), type);
if (cinema.Seats[seatNum].Color == Color.Yellow)
{
//打印
DialogResult result;
result = MessageBox.Show("是否购买!", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (result == DialogResult.Yes)
{
cinema.Seats[seatNum].Color = Color.Red;
UpdateSeat();
newTickey.CalcPrice();
cinema.SoldTickets.Add(newTickey);
label14.Text = newTickey.Price.ToString();
newTickey.Print();
}
else if (result == DialogResult.No)
{
return;
}
}
else
{
//显示当前售出票的信息
foreach (Ticket tickets in cinema.SoldTickets)
{
//判断是否为同场次、同电影、同座位号
if (tickets.Seet.SeatNum == seatNum &&
tickets.ScheduleItem.Time == treeView1.SelectedNode.Text &&
tickets.ScheduleItem.Movie.MovieName == treeView1.SelectedNode.Parent.Text)
{
tickets.Show();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void UpdateSeat()
{
foreach (string item in cinema.Seats.Keys)
{
list[item].BackColor = cinema.Seats[item].Color;
}
}
八、进行当前售票的存储以及显示
在影院类中写俩个方法进行存储和显示
分别利用序列化和反序列化的功能
序列化:save()
public void Save()
{
FileStream fs = new FileStream("soldTickets.txt", FileMode.OpenOrCreate);
StreamWriter writer = new StreamWriter(fs, Encoding.Default);
for (int i = 0; i < SoldTickets.Count; i++)
{
Ticket ticket = SoldTickets[i];
string info = "|" + ticket.ScheduleItem.Movie.MovieName + "|" + ticket.ScheduleItem.Movie.Poster + "|" +
ticket.ScheduleItem.Movie.Director + "|" + ticket.ScheduleItem.Movie.Actor + "|" +
ticket.ScheduleItem.Movie.MovieType.ToString() + "|" +
ticket.ScheduleItem.Movie.Price + "|" + ticket.ScheduleItem.Time + "|" +
ticket.Seet.SeatNum + "|" + ticket.Seet.Color + "|" + ticket.Price + "|";
if (ticket is FreeTicket)
{
string customerName = ((FreeTicket) ticket).CustomerName;
writer.WriteLine("free" + info + customerName);
}
else if (ticket is StudentTicket)
{
writer.WriteLine("student" + info + "");
}
else
{
writer.WriteLine("" + info + "");
}
}
writer.WriteLine("The End");
//MessageBox.Show("保存成功");
writer.Close();
fs.Close();
}
反序列化:Load()
public void Load()
{
try
{
StreamReader reader = new StreamReader("soldTickets.txt", Encoding.GetEncoding("GB2312"));
string line = reader.ReadLine();
string[] propertyValues;
Ticket ticket = null;
while (line.Trim() != "The End")
{
propertyValues = line.Split('|');
string type = propertyValues[0];
Movie movie = new Movie(propertyValues[1], propertyValues[2], propertyValues[3], propertyValues[4],
(MovieType) Enum.Parse(typeof (MovieType), propertyValues[5]), int.Parse(propertyValues[6]));
ScheduleItem scheduleItem = new ScheduleItem();
scheduleItem.Time = propertyValues[7];
scheduleItem.Movie = movie;
string color = propertyValues[9];
string endColor = color.Substring(color.IndexOf("[") + 1, color.Length - 1 - color.IndexOf("[") - 1);
Seat seat = new Seat(propertyValues[8], Color.FromName(endColor));
int discount = 10;
switch (type)
{
case "student":
discount = 7;
ticket = TicketUitl.CreateTicket(scheduleItem, seat, "", Convert.ToInt32(discount), type);
break;
case "free":
discount = 0;
ticket = TicketUitl.CreateTicket(scheduleItem, seat, propertyValues[11],
Convert.ToInt32(discount), type);
break;
default:
discount = 10;
ticket = TicketUitl.CreateTicket(scheduleItem, seat, "", Convert.ToInt32(discount), "");
break;
}
this.SoldTickets.Add(ticket);
line = reader.ReadLine();
}
reader.Close();
}
catch (Exception ex)
{
Console.WriteLine("网络连接异常:" + ex.Message);
SoldTickets = new List();
throw;
}
}
以上则是本项目的多个难点的实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
Oracle影院订票系统,C#实现影院售票系统相关推荐
- 不是吧,阿sir,还有人不会制作影院订票系统前端页面吗?(拿来就用)
影院订票系统前端页面
- java的知识点32——多线程 并发同步的 性能分析、快乐影院 订票操作
多线程 并发 同步 性能分析 /*** 线程安全: 在并发时保证数据的正确性.效率尽可能高* synchronized* 1.同步方法* 2.同步块* @author Administrator ...
- java计算机毕业设计火车订票管理系统源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计火车订票管理系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计火车订票管理系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构:B/S ...
- 基于JAVA航空订票管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA航空订票管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA航空订票管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目架构 ...
- 【毕业设计】基于ssm的演唱会订票管理系统,订票管理系统,网上演唱会票务系统,票务管理系统,附源码+文档+PPT
1.项目介绍 基于ssm的演唱会订票管理系统,订票管理系统,网上演唱会票务系统,票务管理系统. 系统中的核心用户是系统管理员,管理员登录后,主要功能有管理员信息管理.网站用户管理.新闻公告信息管理.演 ...
- SSM实现的影院订票系统-JAVA【数据库设计、源码、开题报告】
1绪论 1.1项目开发背景及意义 随着互联网和电子商务的快速发展,网上购物已经成为了现代人生活的一种方式.如今,淘宝.天猫.京东商城.当当网.聚美优品等一系列的电子商务网站更是把网上购物推向了这个时代 ...
- C语言课程设计火车订票系统存储结构设计,火车售票系统(数据结构课设)
#include #include #include #define MAXSIZE 2000 /*车票信息*/ typedef struct { char chezhan[20];/*车站*/ ch ...
- c语言编程汽车售票系统,C语言汽车售票系统实践报告.doc
C语言汽车售票系统实践报告 二○一○ -二○一二 学年第 二 学期 信息科学与工程学院 课程设计报告书 课程名称: C程序课程设计 班 级: 自动化2010级 6班 学 号: 201004134192 ...
- jsp mysql火车票预定系统_jsp784火车票毕业设计售票系统mysql
开发语言:jsp.框架:jsp+servlet.模式:B/S.数据库:mysql.开发工具:myeclipse eclipse 均可.论文字数:1万左右.毕业设计功能实现 一般会员 (1)注册:对于没 ...
最新文章
- Java 多线程编程(锁优化)
- Spark生态顶级项目汇总
- 最聪明女生集结清华,挑战人工智能
- 链表list(链式存储结构实现)_数据结构知否知否系列之 — 线性表的顺序与链式存储篇(8000 多字长文)...
- android 按钮动画效果_【css特效】按钮动画 - 按压效果
- java中quicksort的参数_Java中的Quicksort
- 如何改变X:\Users\XXX的用户名称
- webapi 找到了与请求匹配的多个操作(ajax报500,4的错误)
- oracle 数据掩码,oracle格式掩码
- Scala 2.8馆藏图书馆是“历史上最长的遗书”吗? [关闭]
- 翻译: TensorFlow 2.0 中的新功能
- 国考地市级各题型分值分布(数量关系10题,其他题型同省级试题相同,共130题)——仅供参考
- 如何才能更持久系列之——如何才能准确测量APP的功耗
- iptable端口重定向 MASQUERADE
- PAT.1143 Lowest Common Ancestor
- 女生适合干【长期第一线编程工作】 男生能干的女生照样可以做的更好
- Typedef 用法总结
- python 发送邮件connect none_python发送邮件(smtplib)
- Python3端口扫描器
- 鸿蒙系统什么时候投入市场,华为鸿蒙系统市场占有率要达多少才可能存活
热门文章
- SpringBoot之----yaml语法详解
- 计算机技能测试题库,计算机应用技能测试题库
- 前端:transition结合transform实现变形的平滑过渡效果
- Rectangle用法简介
- 全栈Python 编程必备
- Catch That Cow(农夫和牛)(BFS入门)(详解)
- 石坑崆(猛坑石)攻略
- 受人民币升值影响 软件业利润同比降4.6%
- ios共享账号公众号_英雄联盟手游预约起来!最新2020年ios日本AppleID账号密码共享...
- mysql hy000 1030_SQLSTATE [HY000]:一般错误:1030