影院售票系統比較麻煩的,一共有9個類,一個枚舉,
這是頁面效果的實現圖

這是幾個類的基本關系

影院類


電影類型 枚舉

贈票,這里需要引入一個命名空間 using System.IO


電影類

放映計划類



放映場次類

座位類

學生票類


電影票父類


創建電影票工具類
使用簡單工廠模式創建票

主窗體代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 青鳥影院 { public partial class FrmCinema : Form { public FrmCinema() { InitializeComponent(); } Cinema cinema = new Cinema(); Label lbl = new Label(); //獲取新放映列表: private void tsmiNew_Click(object sender, EventArgs e) { cinema.Load(); cinema.SoldTickets.Clear(); cinema.Save(); BingTreeView(); } //選擇內容發生改變: private void tvMovies_AfterSelect(object sender, TreeViewEventArgs e) { if (this.tvMovies.SelectedNode.Level == 1) { string time = this.tvMovies.SelectedNode.Text; ScheduleItem item = cinema.Schedule.Items[time]; this.lblActor.Text = item.Movie.Actor; this.lblDirector.Text = item.Movie.Director; this.lblMovieName.Text = item.Movie.MovieName; this.lblPrice.Text = item.Movie.Price.ToString(); this.lblTime.Text = item.Time; this.lblType.Text = item.Movie.MovieType.ToString(); this.picMovie.Image = Image.FromFile(@"Image\" + item.Movie.Poster); this.lblCalcPrice.Text = item.Movie.Price.ToString(); //將所有座位設置為黃色 foreach (Seat var in cinema.Seats.Values) { var.Color = Color.Yellow; } //在已售出的票中循環判斷 foreach (Ticket ticket in cinema.SoldTickets) { foreach (Seat seat in this.cinema.Seats.Values) { //場次相同且座位號相同 if (ticket.ScheduleItem.Time == time && ticket.Seat.SeatNum == seat.SeatNum) { //更新座位顏色 seat.Color = Color.Red; } } } // 將座位顏色更新到Label上顯示 foreach (Seat seat in cinema.Seats.Values) { foreach (Label lbl in tpCinema.Controls) { // 座位號相同證明是對應Label if (lbl.Text == seat.SeatNum) { lbl.BackColor = seat.Color; } } } } } //點擊普通票 private void rdoNormal_CheckedChanged(object sender, EventArgs e) { this.cmbDisCount.Enabled = false; this.txtCustomer.Enabled = false; this.lblCalcPrice.Text = lblPrice.Text; } //點擊贈票 private void rdoFree_CheckedChanged(object sender, EventArgs e) { this.txtCustomer.Enabled = true; this.cmbDisCount.Enabled = false; this.lblCalcPrice.Text = lblPrice.Text; } //點擊學生票 private void rdoStudent_CheckedChanged(object sender, EventArgs e) { if (this.lblPrice.Text != "") { this.cmbDisCount.Enabled = true; this.txtCustomer.Enabled = false; this.lblCalcPrice.Text = (Convert.ToDouble(this.lblPrice.Text) * Convert.ToDouble(this.cmbDisCount.Text) / 10).ToString(); } } //加載 private void FrmCinema_Load(object sender, EventArgs e) { this.rdoNormal.Checked = true; this.cmbDisCount.SelectedIndex = 0; InitSeats(5, 7); } //選擇折扣變化: private void cmbDisCount_SelectedIndexChanged(object sender, EventArgs e) { if (this.lblPrice.Text != "") { this.lblCalcPrice.Text = (Convert.ToDouble(this.lblPrice.Text) * Convert.ToDouble(this.cmbDisCount.Text) / 10).ToString(); } } // 獲取放映列表綁定到TreeView private void BingTreeView() { this.tvMovies.Nodes.Clear(); //加載XML cinema.Schedule.LoadItems(); //綁定到TreeView TreeNode root = null; foreach (ScheduleItem var in cinema.Schedule.Items.Values) { if (root == null || root.Text != var.Movie.MovieName) { //根節點 root = new TreeNode(var.Movie.MovieName); this.tvMovies.Nodes.Add(root); } //子節點 root.Nodes.Add(var.Time); } } // 初始化座位 private void InitSeats(int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { Label lb = new Label(); lb.BackColor = Color.Yellow; lb.Location = new Point(20 + j * 100, 50 + i * 70); lb.Font = new Font("Courier New", 11); lb.Name = (i + 1) + "-" + (j + 1); lb.Size = new Size(80, 30); lb.TabIndex = 0; lb.Text = (i + 1) + "-" + (j + 1); lb.TextAlign = ContentAlignment.MiddleCenter; lb.Click += lb_Click; tpCinema.Controls.Add(lb); //添加座位對象到CInema的Seats集合中 Seat seat = new Seat(lb.Text, Color.Yellow); cinema.Seats.Add(seat.SeatNum, seat); } } } private void lb_Click(object sender, EventArgs e) { if (this.tvMovies.Nodes.Count == 0 || this.tvMovies.SelectedNode.Level ==0) { return; } lbl = sender as Label; if (lbl.BackColor == Color.Red) { MessageBox.Show("已售出"); } else { if (DialogResult.OK == MessageBox.Show("是否購買", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)) { //取得放映時間 string time = this.tvMovies.SelectedNode.Text; //使用時間作為鍵找到放映場次對象 ScheduleItem item = cinema.Schedule.Items[time]; string type = string.Empty; type = rdoNormal.Checked ? "normal" : rdoFree.Checked ? "free" : "student"; Ticket ticket = TicketUtil.CreateTicket(item, cinema.Seats[lbl.Text], txtCustomer.Text, Convert.ToDouble(cmbDisCount.Text), type); //添加到已銷售的集合中 cinema.SoldTickets.Add(ticket); //出票 ticket.Print(); //更新顏色 lbl.BackColor = Color.Red; cinema.Seats[lbl.Text].Color = Color.Red; } } } //保存 private void tsmiSave_Click(object sender, EventArgs e) { cinema.Save(); } //繼續銷售 private void tsmiMovies_Click(object sender, EventArgs e) { cinema.Load(); BingTreeView(); // 將座位顏色更新到Label上顯示 foreach (Seat seat in cinema.Seats.Values) { foreach (Label lbl in tpCinema.Controls) { // 座位號相同證明是對應Label if (lbl.Text == seat.SeatNum) { lbl.BackColor = seat.Color; } } } } private void groupBox1_Enter(object sender, EventArgs e) { } } }
