C#实现影院售票系统

作者:可爱的黄油手 时间:2021-12-27 00:53:26 

本文实例为大家分享了C#实现影院售票系统的具体代码,供大家参考,具体内容如下

C#实现影院售票系统

本人认为此项目的难点有4点

1.首先是将解析完的XML文件绑定到TreeView上
2.用代码动态生成座位的label,生成触发事件Label_Click,俩组放映时间的售出座位是不同的
3.用序列化与反序列化实现代码的多次利用
4.打印票务

C#实现影院售票系统

创建与本项目相关的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 <seatRow; 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<string, ScheduleItem> 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();

之后的成功如下图所示

C#实现影院售票系统

五、完成影片详情的绑定

将TreeView上的文件信息以单机的形式绑定到详情上


foreach (KeyValuePair<string, ScheduleItem> 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<Ticket>();
       throw;
     }
   }

以上则是本项目的多个难点的实现。

来源:https://blog.csdn.net/gengzhi1293443962/article/details/61195504

标签:C#,售票系统
0
投稿

猜你喜欢

  • Spring Data Jpa实现分页和排序代码实例

    2021-11-08 01:19:48
  • android 获取视频,图片缩略图的具体实现

    2023-07-28 00:20:39
  • Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    2023-07-02 18:42:50
  • rocketmq如何修改存储路径

    2022-08-20 08:00:57
  • Java实现聊天机器人完善版

    2022-10-07 09:31:11
  • Android继承现有控件拓展实现自定义控件textView

    2021-05-29 06:29:15
  • hadoop上传文件功能实例代码

    2021-11-01 00:57:59
  • SpringMVC中的handlerMappings对象用法

    2023-01-09 21:38:36
  • Android实现绘制LocationMarkerView图的示例代码

    2023-01-14 07:55:29
  • 通过实例解析Spring Ioc项目实现过程

    2023-11-24 10:12:33
  • eclipse下配置Spring环境的方法步骤

    2023-02-27 20:39:26
  • Java并发编程之阻塞队列详解

    2022-06-20 02:08:19
  • Java 添加、读取和删除 Excel 批注的操作代码

    2023-10-28 21:55:36
  • Java利用Dijkstra算法求解拓扑关系最短路径

    2021-08-24 10:30:54
  • 解决Java中OutOfMemoryError的问题

    2023-01-26 13:51:03
  • Spring AOP源码深入分析

    2023-08-15 13:01:16
  • Java中高效的判断数组中某个元素是否存在详解

    2021-05-25 17:32:08
  • java中两个byte数组实现合并的示例

    2021-10-16 20:26:48
  • Spring中的注解之@Override和@Autowired

    2022-08-07 19:56:47
  • Java对象不使用时赋值null的意义详解

    2023-11-25 01:46:20
  • asp之家 软件编程 m.aspxhome.com