📄 mainform.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace GreenBirdCinema
{
[Serializable]
public partial class MainForm : Form
{
Dictionary<string, Label> labels = new Dictionary<string, Label>();//保存所有座位标签的集合
Cinema cinema;
string key = null; //获得用户选择的电影的时间场次
string seatNumber = ""; //用户点击购买的标签的文本值
Setup setup = new Setup(); //实例化一个保存用户设置的对象
public MainForm()
{
InitializeComponent();
}
/****************************************方法******************************/
#region
/// <summary>
/// 动态加载座位的方法
/// </summary>
/// <param name="seatRow"></param>
/// <param name="seatLine"></param>
/// <param name="tb"></param>
private void InitSeats(int seatRow, int seatLine, TabPage tb)
{
Label label;
Seat seat;
for (int i = 0; i < seatRow; i++) //外层循环打印行
{
for (int j = 0; j < seatLine; j++) //内层循环打印列
{
label = new Label();
label.BackColor = Color.Red;
label.AutoSize = true;
label.Font = new Font("宋体",14.25F,FontStyle.Regular,GraphicsUnit.Point,((byte)(134)));
label.Name = "lbl" + (j + 1).ToString() + "_" + (i + 1).ToString();
label.Size = new Size(50,25);
label.Cursor = Cursors.Hand;
label.Text = (j + 1).ToString() + "-" + (i + 1).ToString();//给座位上面显示号码
label.TextAlign = ContentAlignment.MiddleCenter;
label.Location = new Point(30+(i*90),25+(j*60)); //给座位设定位置
tb.Controls.Add(label); //把座位添加到放映厅
labels.Add(label.Text,label);
seat = new Seat((j + 1).ToString() + "-" + (i + 1).ToString(), Color.Red);//参数座位号,颜色
cinema.Seats.Add(seat.SeatNumber, seat); //把座位加进集合
label.Click += new EventHandler(lblSeat_Click); //绑定到一个单击事件
}
}
}
/// <summary>
/// 填充电影列表的方法
/// </summary>
private void InitTreeView()
{
tvPlayList.BeginUpdate();
tvPlayList.Nodes.Clear();
string movieName = "";
TreeNode movieNode = null;
foreach (ScheduleItem item in cinema.Schedule.Items.Values)
{
if (movieName != item.Movie.MovieName) //实现一个电影两个时间段
{
movieNode = new TreeNode(item.Movie.MovieName);
tvPlayList.Nodes.Add(movieNode);
}
TreeNode timeNode = new TreeNode(item.Time);
movieNode.Nodes.Add(timeNode);
movieName = item.Movie.MovieName;
}
tvPlayList.EndUpdate();
}
/// <summary>
/// 把所有的座位还原
/// </summary>
private void ClearSeat()
{
foreach (Seat seat in cinema.Seats.Values)
{
seat.Color = Color.Red;
}
}
/// <summary>
/// 更新座位状态
/// </summary>
private void UpdateSeatColor()
{
foreach (string key in cinema.Seats.Keys)
{
labels[key].BackColor = cinema.Seats[key].Color; //从集合中读取座位的颜色
}
}
//窗体关闭时对用户的设置进行序列化
private void SaveSetup()
{
try
{
FileStream fs = new FileStream("setup.bin", FileMode.Create,FileAccess.Write);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs,setup);
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//窗体加载时对用户的设置进行反序列化
private void OpenSetup()
{
try
{
FileStream fs = new FileStream("setup.bin", FileMode.Open, FileAccess.Read);
BinaryFormatter bf = new BinaryFormatter();
setup = (Setup)bf.Deserialize(fs);
fs.Close();
skinEngine1.ApplyAdditionalBuiltInSkins(4);
tsmiOpenList.Checked = setup.OpenList;
tsmiAutoSave.Checked = setup.AutoSave;
if (setup.Opacity < 0.3) { setup.Opacity = 0.5; }
Opacity = setup.Opacity;
}
catch (Exception ex)
{
skinEngine1.ApplyAdditionalBuiltInSkins(4);
tsmiOpenList.Checked = true;
tsmiAutoSave.Checked = true;
Opacity = 1.0;
}
}
#endregion
/****************************************各事件******************************/
/// <summary>
/// 窗体加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MainForm_Load(object sender, EventArgs e)
{
cboDiscount.SelectedIndex = 4; //学生票默认的是打5折
rdoCommon.Checked = true; //把普通票选中
lblDiscount.Visible = false; //把折扣、赠票、赠送者等都设为不可见
lblDonate.Visible = false;
cboDiscount.Visible = false;
txtDonate.Visible = false;
cinema = new Cinema();
InitSeats(6,5, tpCinema); //调用加载座位的方法加载座位
cinema.Load(); //加载座位
OpenSetup(); //对窗体设置
}
/// <summary>
/// 购买座位事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lblSeat_Click(object sender, EventArgs e)
{
try
{
seatNumber = ((Label)sender).Text;
if (((Label)sender).BackColor == Color.Green) //如果座位背景色为红,即出售
{
MessageBox.Show("已出售!");
return;
}
TreeNode node = tvPlayList.SelectedNode;
if (node == null || node.Level != 1) //判断选择的深度
{
MessageBox.Show("请选择一个场次!");
return;
}
TicketType type;
int discount = 0; //折扣数
string customerName = ""; //赠送者
if (rdoCommon.Checked) //选择普通票
{
type = TicketType.normal;
}
else if (rdoStudent.Checked) //选择学生票
{
type = TicketType.student;
discount = int.Parse(cboDiscount.Text);
}
else //选择赠票
{
if (txtDonate.Text.Trim().Length == 0)
{
MessageBox.Show("输入赠送者名字!");
return;
}
type = TicketType.free;
customerName = txtDonate.Text;
}
Ticket newTicket =
TicketFactory.CreateTicket(cinema.Schedule.Items[key], cinema.Seats[seatNumber], discount, customerName, type);
DialogResult answer=
MessageBox.Show("你确定要购买?","购买提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
if (answer == DialogResult.Yes)
{
cinema.Seats[seatNumber].Color = Color.Green; //确定买设为红色
UpdateSeatColor(); //每购买一次刷新一次座位
cinema.SoldTickets.Add(newTicket); //确定购买后向已售出的集合中添加已出售的座位
newTicket.CalcPrice(); //多态调用各计算价格方法
lblYingFu.Text = newTicket.Price.ToString();
newTicket.Print();
if (tsmiOpenList.Checked) //设置为每购买一次都打开清单
{
Process.Start(newTicket.FileName);
}
if (type == TicketType.free) //如果是赠票
{
txtDonate.Text = "";
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 在选择树节点后发生,选择一个电影的时间后发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvPlayList_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode node = tvPlayList.SelectedNode;
if (node == null) //没有选中
{
return;
}
if (node.Level != 1) //选中深度不是1
{
return;
}
key = node.Text;
//显示影片的详细信息
lblPianMing.Text = cinema.Schedule.Items[key].Movie.MovieName;
lblDaoYan.Text = cinema.Schedule.Items[key].Movie.Director;
lblZhuYan.Text = cinema.Schedule.Items[key].Movie.Actor;
lblLeiXing.Text = cinema.Schedule.Items[key].Movie.MovieType.ToString();
lblShiJian.Text = cinema.Schedule.Items[key].Time;
lblPiaoJia.Text = cinema.Schedule.Items[key].Movie.Price.ToString();
picMovie.Image = Image.FromFile(cinema.Schedule.Items[key].Movie.Poster);
lblYingFu.Text = "";
ClearSeat(); //先把每个座位都还原后再改变颜色
foreach (Ticket ticket in cinema.SoldTickets)
{
foreach (Seat seat in cinema.Seats.Values)
{ //如果已售出的票的时间和用户选择的时间相同并且座位号相同则把该座位变为绿色
if ((ticket.ScheduleItem.Time == key) && (ticket.Seat.SeatNumber == seat.SeatNumber))
{
seat.Color = Color.Green;
}
}
}
UpdateSeatColor();
}
/// <summary>
/// 窗体关闭事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (!tsmiAutoSave.Checked ) //没有设为自动保存提示用户是否保存销售结果
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -