最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)影院售票系統(tǒng)

 更新時(shí)間:2019年01月24日 09:58:55   作者:可愛的黃油手  
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)影院售票系統(tǒng),解析了售票系統(tǒng)的難點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C#實(shí)現(xiàn)影院售票系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下

本人認(rèn)為此項(xiàng)目的難點(diǎn)有4點(diǎn)

1.首先是將解析完的XML文件綁定到TreeView上
2.用代碼動(dòng)態(tài)生成座位的label,生成觸發(fā)事件Label_Click,倆組放映時(shí)間的售出座位是不同的
3.用序列化與反序列化實(shí)現(xiàn)代碼的多次利用
4.打印票務(wù)

創(chuàng)建與本項(xiàng)目相關(guān)的10個(gè)類

一、首先在放映計(jì)劃類中創(chuàng)建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);

//因?yàn)榉庞硶r(shí)間不在電影類中,所以經(jīng)過第二次遍歷,找到時(shí)間,最后將所有解析完的文件添加到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);  
        }
      }

利用雙循環(huán)自動(dòng)生成6行5列的座位表,其中將控件的大小和顏色以及位置進(jìn)行固定

三、將解析完的文件綁定到Dic的集合中后再主窗體上進(jìn)行綁定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();

之后的成功如下圖所示

五、完成影片詳情的綁定

將TreeView上的文件信息以單機(jī)的形式綁定到詳情上

 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;
      }
    }

六、選擇特殊票系列特殊票分為學(xué)生票,普通票和贈(zèng)票學(xué)生票類和贈(zèng)票類分別繼承它門的父類售票類學(xué)生票子類有獨(dú)立的屬性Discount(學(xué)生票折扣)贈(zèng)票子類也有獨(dú)立的屬性CustomerName(贈(zèng)送者的名字)都繼承父類的票價(jià)的計(jì)算方法

當(dāng)觸發(fā)普通票時(shí),折扣下拉框以及贈(zèng)票者框關(guān)閉

當(dāng)觸發(fā)贈(zèng)票時(shí),折扣下拉框關(guān)閉,贈(zèng)票者框打開

當(dāng)觸發(fā)學(xué)生票時(shí),贈(zèng)票者框關(guān)閉,折扣下來框打開

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();
      }
      
    }

七、售票售票當(dāng)中我們會(huì)用到一種設(shè)計(jì)模式,工廠模式,建立工廠類

 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;
   }
  }

在工廠類中我們以票類當(dāng)作類型聲明一個(gè)帶參方法來判斷三次不同的售票類型

之后所調(diào)用他們各子重寫父類的CalcPrice()方法進(jìn)行票務(wù)的結(jié)束工作

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("請輸入折扣數(shù)!", "提示");
              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";
          }
          //調(diào)用工具類創(chuàng)建票
          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
          {
            //顯示當(dāng)前售出票的信息
            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;
      }
      
      
    }

八、進(jìn)行當(dāng)前售票的存儲(chǔ)以及顯示

在影院類中寫倆個(gè)方法進(jìn)行存儲(chǔ)和顯示
分別利用序列化和反序列化的功能

序列化: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("網(wǎng)絡(luò)連接異常:" + ex.Message);
        SoldTickets = new List<Ticket>();
        throw;
      }
    }

以上則是本項(xiàng)目的多個(gè)難點(diǎn)的實(shí)現(xiàn)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#遞歸算法之快速排序

    C#遞歸算法之快速排序

    快速排序由C.A.R發(fā)明,它依據(jù)中心元素的值,利用一系列遞歸調(diào)用將數(shù)據(jù)表劃分成越來越小的子表。在每一步調(diào)用中,經(jīng)過多次的交換,最終為中心元素找到最終的位置。
    2016-06-06
  • C#使用WebSocket與網(wǎng)頁實(shí)時(shí)通信的實(shí)現(xiàn)示例

    C#使用WebSocket與網(wǎng)頁實(shí)時(shí)通信的實(shí)現(xiàn)示例

    本文主要介紹了C#使用WebSocket與網(wǎng)頁實(shí)時(shí)通信的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Unity 百度AI實(shí)現(xiàn)人像動(dòng)漫化效果

    Unity 百度AI實(shí)現(xiàn)人像動(dòng)漫化效果

    這篇文章主要介紹了Unity如何接入百度AI接口, 運(yùn)用對抗生成網(wǎng)絡(luò)技術(shù),為用戶量身定制千人千面的二次元?jiǎng)勇蜗?,并支持通過參數(shù)設(shè)置,生成二次元?jiǎng)勇讼瘛8信d趣的可以學(xué)習(xí)一下
    2022-01-01
  • Unity游戲開發(fā)實(shí)現(xiàn)背包系統(tǒng)的示例詳解

    Unity游戲開發(fā)實(shí)現(xiàn)背包系統(tǒng)的示例詳解

    這篇文章主要為大家介紹了Unity游戲開發(fā)實(shí)現(xiàn)背包系統(tǒng)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • C#使用第三方組件生成二維碼匯總

    C#使用第三方組件生成二維碼匯總

    本文給大家匯總了幾種C#使用第三方組件生成二維碼的方法以及示例,非常的簡單實(shí)用,都是項(xiàng)目中經(jīng)常需要用到的,希望大家能夠喜歡
    2016-12-12
  • C#實(shí)現(xiàn)異步GET的方法

    C#實(shí)現(xiàn)異步GET的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)異步GET的方法,涉及C#異步請求的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

    如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

    Dapper類是一個(gè)開源的數(shù)據(jù)庫操作類,下面這篇文章主要給大家介紹了關(guān)于如何使用Dapper處理多個(gè)結(jié)果集與多重映射的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • WPF如何自定義TabControl控件樣式示例詳解

    WPF如何自定義TabControl控件樣式示例詳解

    這篇文章主要給大家介紹了關(guān)于WPF如何自定義TabControl控件樣式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • C# WPF開源UI控件庫MaterialDesign介紹

    C# WPF開源UI控件庫MaterialDesign介紹

    這篇文章介紹了C# WPF開源UI控件庫MaterialDesign,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • C#向線程中傳遞多個(gè)參數(shù)的解決方法(兩種)

    C#向線程中傳遞多個(gè)參數(shù)的解決方法(兩種)

    這篇文章主要介紹了C#向線程中傳遞多個(gè)參數(shù)的解決方法(兩種)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07

最新評論

汨罗市| 东乌珠穆沁旗| 西宁市| 永福县| 江安县| 万安县| 鄢陵县| 永昌县| 永修县| 梁河县| 大田县| 洛宁县| 五大连池市| 黎城县| 清徐县| 江山市| 长沙市| 民乐县| 清苑县| 微博| 舒兰市| 微博| 札达县| 教育| 昌都县| 泰安市| 上思县| 界首市| 威宁| 丁青县| 霍州市| 普兰县| 杨浦区| 宁南县| 陵川县| 彭山县| 乐亭县| 阿拉善盟| 谢通门县| 秀山| 章丘市|