昨天發布了總結項目的第一篇,需求分析以及類的搭建,今天繼續更新,動態繪制控件、票類型的切換以及數據在窗體中的展現。
先從簡單的開始,票類型的切換。
分析:
1.當點擊普通票時 學生折扣和贈送者是禁用的
2.點擊贈票時 啟用贈送者,禁用學生折扣
3.點擊學生票時 啟用學生折扣,禁用贈送者
學生折扣ComboBox下拉框可以選擇折扣,根據折扣實時折扣計算價格到優惠價上。
需要注意的是:
如果沒有選擇ListView的電影場次(也就是時間),選擇贈票和學生票是沒有意義的甚至會引發學生票實時計算時的異常,所以我們要判斷
1 if (this.treeView1.SelectedNode == null) return;
因此我們便可以設計三個RadioButton的點擊事件代碼

1 private void rdoGiveTicket_CheckedChanged(object sender, EventArgs e) 2 { 3 if (this.treeView1.SelectedNode == null) return; 4 this.lblOriginalPrice.Text = "0"; 5 this.cboDiscount.Enabled = false; 6 this.txtGiver.Enabled = true; 7 }

1 private void rdoStuTicket_CheckedChanged(object sender, EventArgs e) 2 { 3 if (this.treeView1.SelectedNode == null) return; 4 this.cboDiscount.Enabled = true; 5 this.txtGiver.Enabled = false; 6 }

1 private void rdoNormal_CheckedChanged(object sender, EventArgs e) 2 { 3 this.cboDiscount.Enabled = false; 4 this.txtGiver.Enabled = false; 5 if (!GetKey()) return; 6 //更新原價,因為點擊贈票時價格為0了 7 this.lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString(); 8 }
為了美觀也可以調用ClearContent()方法清空一下可能殘留的信息
private void ClearContent() { //點擊時間(場次)時切換回普通票 並清空可能殘留的信息 txtGiver.Text = ""; cboDiscount.Text = ""; }
由於普通票切換回來的時候需要刷新價格,所以要獲取價格;cinema電影院對象是一個全局對象(可以看上一篇的類),key是一個全局的變量,存儲的是選中場次的時間,用來做放映場次的Key。GetKey()方法是獲取選中場次的時間並返回布爾值,看代碼實例

1 public bool GetKey() 2 { 3 //選中節點 4 TreeNode node = this.treeView1.SelectedNode; 5 //如果沒有選擇節點=》結束 6 if (node == null) return false; 7 //如果選中節點不是場次(時間)=》結束 8 if (node.Level != 1) return false; 9 //獲取時間作為key 10 key = node.Text; 11 if (key != "" && key != null) return true; 12 return false; 13 }
然后就是將XML中的數據綁定TreeView並在選擇TreeView的時間節點是將影片信息展現在窗體中
之前在搭建類的時候用到 Schedule 放映計划類有一個方法LoadItems()就是將XML信息解析並添加到放映計划集合中
提取出InitTreeView()方便更新時調用
cinema.Schedule.LoadItems();放到窗體的加載事件或初始化中

1 private void InitTreeView() 2 { 3 this.treeView1.Nodes.Clear(); 4 string movieName = ""; 5 TreeNode tn = null; 6 foreach (ScheduleItem item in cinema.Schedule.Items.Values) 7 { 8 //如果不存在此電影節點,創建電影節點 9 if (item.Movie.MovieName != movieName) 10 { 11 tn = new TreeNode(item.Movie.MovieName); 12 tn.Tag = item.Movie; 13 this.treeView1.Nodes.Add(tn); 14 } 15 //增加場次時間節點 16 TreeNode time = new TreeNode(item.Time); 17 tn.Nodes.Add(time); 18 //獲取當前場次的電影名字,重新遍歷 19 movieName = item.Movie.MovieName; 20 } 21 //展開所有的節點 22 this.treeView1.ExpandAll(); 23 }
接下來就是選中場次節點時將電影的詳細信息展現在窗體中

1 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 2 { 3 //清空殘留信息 4 ClearContent(); 5 rdoNormal.Checked = true; 6 //獲取key 7 if (!GetKey()) return; 8 lblName.Text = cinema.Schedule.Items[key].Movie.MovieName; 9 lblDate.Text = key; 10 lblType.Text = cinema.Schedule.Items[key].Movie.MovieType.ToString(); 11 lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString(); 12 lblMainAct.Text = cinema.Schedule.Items[key].Movie.Actor; 13 lblDirect.Text = cinema.Schedule.Items[key].Movie.Director; 14 this.pictureBox1.Image = Image.FromFile(cinema.Schedule.Items[key].Movie.Poster); 15 this.lblPreferentialPrice.Text = ""; 16 }
最后是將座位信息以label標簽的形式動態繪制到窗體里,這里也是最難的地方,參考了一下書

1 private void InitialSeat() 2 { 3 int seatRow = 7; 4 int seatLine = 5; 5 for (int i = 0; i < seatRow; i++)//列 6 { 7 for (int j = 0; j < seatLine; j++)//行 8 { 9 label = new Label(); 10 //設置背景顏色 11 label.BackColor = Color.Yellow; 12 //設置字體 字體,大小,指定應用到文本的字形信息為普通文本,指定給定數據的度量單位,新字體的GDI字符集 13 label.Font = new System.Drawing.Font("宋體", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); 14 //取消自動尺寸方便我們設置尺寸 15 label.AutoSize = false; 16 //指定label的寬和高 17 label.Size = new System.Drawing.Size(50, 25); 18 //設置座位號 19 label.Text = (j + 1).ToString() + "-" + (i + 1).ToString(); 20 label.TextAlign = ContentAlignment.MiddleCenter; 21 //設置位置 22 label.Location = new Point(60 + (i * 100), 60 + (j * 60)); 23 //所有的標簽綁定到同一事件,lblSeat_Click是我們手動寫的事件 24 label.Click += new System.EventHandler(lblSeat_Click); 25 //tb是TabPage 26 tb.Controls.Add(label); 27 //加入到全局的labels集合中 28 labels.Add(label.Text, label); 29 //實例化一個座位Seat構造函數的參數為座位號及顏色 30 seat = new Seat((j + 1).ToString() + "-" + (i + 1).ToString(), Color.Yellow); 31 cinema.Seats.Add(seat.SeatNum, seat); 32 } 33 }
明天將會繼續更新:購票、座位顏色狀態的改變及場次座位狀態的顯示
歡迎大神斧正教導