服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#实现影院售票系统

C#实现影院售票系统

2022-03-09 13:28可爱的黄油手 C#

这篇文章主要为大家详细介绍了C#实现影院售票系统,解析了售票系统的难点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

C#实现影院售票系统

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

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

C#实现影院售票系统

创建与本项目相关的10个类

一、首先在放映计划类中创建loaditems()方法来解析showlist.xml文件

?
1
2
3
4
5
6
7
8
9
10
11
12
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的双列集合中

?
1
2
3
4
5
6
7
8
9
foreach (xmlnode itemm in item["schedule"])
    {
      scheduleitem scheduleitem=new scheduleitem();
      scheduleitem.time = itemm.innertext;
         
         
      scheduleitem.movie = movie;
         
      dic.add(scheduleitem.time, scheduleitem);

二、将座位用代码填入放映厅中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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上的文件信息以单机的形式绑定到详情上

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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(赠送者的名字)都继承父类的票价的计算方法

当触发普通票时,折扣下拉框以及赠票者框关闭

当触发赠票时,折扣下拉框关闭,赠票者框打开

当触发学生票时,赠票者框关闭,折扣下来框打开

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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();
      }
      
    }

七、售票售票当中我们会用到一种设计模式,工厂模式,建立工厂类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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()方法进行票务的结束工作

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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()

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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()

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16