C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(2)
本文繼續(xù)更新,動(dòng)態(tài)繪制控件、票類型的切換以及數(shù)據(jù)在窗體中的展現(xiàn)。
先從簡單的開始,票類型的切換。

分析:
1.當(dāng)點(diǎn)擊普通票時(shí) 學(xué)生折扣和贈(zèng)送者是禁用的
2.點(diǎn)擊贈(zèng)票時(shí) 啟用贈(zèng)送者,禁用學(xué)生折扣
3.點(diǎn)擊學(xué)生票時(shí) 啟用學(xué)生折扣,禁用贈(zèng)送者
學(xué)生折扣ComboBox下拉框可以選擇折扣,根據(jù)折扣實(shí)時(shí)折扣計(jì)算價(jià)格到優(yōu)惠價(jià)上。
需要注意的是:
如果沒有選擇ListView的電影場次(也就是時(shí)間),選擇贈(zèng)票和學(xué)生票是沒有意義的甚至?xí)l(fā)學(xué)生票實(shí)時(shí)計(jì)算時(shí)的異常,所以我們要判斷
if (this.treeView1.SelectedNode == null) return;
因此我們便可以設(shè)計(jì)三個(gè)RadioButton的點(diǎn)擊事件代碼
private void rdoGiveTicket_CheckedChanged(object sender, EventArgs e)
{
if (this.treeView1.SelectedNode == null) return;
this.lblOriginalPrice.Text = "0";
this.cboDiscount.Enabled = false;
this.txtGiver.Enabled = true;
}
private void rdoStuTicket_CheckedChanged(object sender, EventArgs e)
{
if (this.treeView1.SelectedNode == null) return;
this.cboDiscount.Enabled = true;
this.txtGiver.Enabled = false;
}
private void rdoNormal_CheckedChanged(object sender, EventArgs e)
{
this.cboDiscount.Enabled = false;
this.txtGiver.Enabled = false;
if (!GetKey()) return;
//更新原價(jià),因?yàn)辄c(diǎn)擊贈(zèng)票時(shí)價(jià)格為0了
this.lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString();
}
為了美觀也可以調(diào)用ClearContent()方法清空一下可能殘留的信息
private void ClearContent()
{
//點(diǎn)擊時(shí)間(場次)時(shí)切換回普通票 并清空可能殘留的信息
txtGiver.Text = "";
cboDiscount.Text = "";
}
由于普通票切換回來的時(shí)候需要刷新價(jià)格,所以要獲取價(jià)格;cinema電影院對象是一個(gè)全局對象(可以看上一篇的類),key是一個(gè)全局的變量,存儲(chǔ)的是選中場次的時(shí)間,用來做放映場次的Key。GetKey()方法是獲取選中場次的時(shí)間并返回布爾值,看代碼實(shí)例
public bool GetKey()
{
//選中節(jié)點(diǎn)
TreeNode node = this.treeView1.SelectedNode;
//如果沒有選擇節(jié)點(diǎn)=》結(jié)束
if (node == null) return false;
//如果選中節(jié)點(diǎn)不是場次(時(shí)間)=》結(jié)束
if (node.Level != 1) return false;
//獲取時(shí)間作為key
key = node.Text;
if (key != "" && key != null) return true;
return false;
}
然后就是將XML中的數(shù)據(jù)綁定TreeView并在選擇TreeView的時(shí)間節(jié)點(diǎn)是將影片信息展現(xiàn)在窗體中
之前在搭建類的時(shí)候用到 Schedule 放映計(jì)劃類有一個(gè)方法LoadItems()就是將XML信息解析并添加到放映計(jì)劃集合中
提取出InitTreeView()方便更新時(shí)調(diào)用cinema.Schedule.LoadItems();放到窗體的加載事件或初始化中
private void InitTreeView()
{
this.treeView1.Nodes.Clear();
string movieName = "";
TreeNode tn = null;
foreach (ScheduleItem item in cinema.Schedule.Items.Values)
{
//如果不存在此電影節(jié)點(diǎn),創(chuàng)建電影節(jié)點(diǎn)
if (item.Movie.MovieName != movieName)
{
tn = new TreeNode(item.Movie.MovieName);
tn.Tag = item.Movie;
this.treeView1.Nodes.Add(tn);
}
//增加場次時(shí)間節(jié)點(diǎn)
TreeNode time = new TreeNode(item.Time);
tn.Nodes.Add(time);
//獲取當(dāng)前場次的電影名字,重新遍歷
movieName = item.Movie.MovieName;
}
//展開所有的節(jié)點(diǎn)
this.treeView1.ExpandAll();
}
接下來就是選中場次節(jié)點(diǎn)時(shí)將電影的詳細(xì)信息展現(xiàn)在窗體中
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
//清空殘留信息
ClearContent();
rdoNormal.Checked = true;
//獲取key
if (!GetKey()) return;
lblName.Text = cinema.Schedule.Items[key].Movie.MovieName;
lblDate.Text = key;
lblType.Text = cinema.Schedule.Items[key].Movie.MovieType.ToString();
lblOriginalPrice.Text = cinema.Schedule.Items[key].Movie.Price.ToString();
lblMainAct.Text = cinema.Schedule.Items[key].Movie.Actor;
lblDirect.Text = cinema.Schedule.Items[key].Movie.Director;
this.pictureBox1.Image = Image.FromFile(cinema.Schedule.Items[key].Movie.Poster);
this.lblPreferentialPrice.Text = "";
}
最后是將座位信息以label標(biāo)簽的形式動(dòng)態(tài)繪制到窗體里,這里也是最難的地方,參考了一下書
private void InitialSeat()
{
int seatRow = 7;
int seatLine = 5;
for (int i = 0; i < seatRow; i++)//列
{
for (int j = 0; j < seatLine; j++)//行
{
label = new Label();
//設(shè)置背景顏色
label.BackColor = Color.Yellow;
//設(shè)置字體 字體,大小,指定應(yīng)用到文本的字形信息為普通文本,指定給定數(shù)據(jù)的度量單位,新字體的GDI字符集
label.Font = new System.Drawing.Font("宋體", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//取消自動(dòng)尺寸方便我們設(shè)置尺寸
label.AutoSize = false;
//指定label的寬和高
label.Size = new System.Drawing.Size(50, 25);
//設(shè)置座位號
label.Text = (j + 1).ToString() + "-" + (i + 1).ToString();
label.TextAlign = ContentAlignment.MiddleCenter;
//設(shè)置位置
label.Location = new Point(60 + (i * 100), 60 + (j * 60));
//所有的標(biāo)簽綁定到同一事件,lblSeat_Click是我們手動(dòng)寫的事件
label.Click += new System.EventHandler(lblSeat_Click);
//tb是TabPage
tb.Controls.Add(label);
//加入到全局的labels集合中
labels.Add(label.Text, label);
//實(shí)例化一個(gè)座位Seat構(gòu)造函數(shù)的參數(shù)為座位號及顏色
seat = new Seat((j + 1).ToString() + "-" + (i + 1).ToString(), Color.Yellow);
cinema.Seats.Add(seat.SeatNum, seat);
}
}
之后文章將會(huì)繼續(xù)更新:購票、座位顏色狀態(tài)的改變及場次座位狀態(tài)的顯示,希望大家繼續(xù)關(guān)注。
以上就是本文的全部內(nèi)容,希望大家喜歡。
相關(guān)文章
C#實(shí)現(xiàn)在控制臺輸入密碼顯示星號的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在控制臺輸入密碼顯示星號的方法,感興趣的小伙伴們可以參考一下2016-04-04
C#導(dǎo)出網(wǎng)站功能實(shí)例代碼講解
這篇文章主要介紹了C#導(dǎo)出網(wǎng)站功能實(shí)例代碼,需要的朋友可以參考下2015-10-10
C# 解決datagridview控件顯示大量數(shù)據(jù)拖拉卡頓問題
這篇文章主要介紹了C# 解決datagridview控件顯示大量數(shù)據(jù)拖拉卡頓問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
C# 表達(dá)式樹Expression Trees的知識梳理
本篇文章主要介紹了表達(dá)式樹 Expression Trees的基礎(chǔ)知識:Lambda 表達(dá)式創(chuàng)建表達(dá)式樹;API 創(chuàng)建表達(dá)式樹;編譯表達(dá)式樹;執(zhí)行表達(dá)式樹;修改表達(dá)式樹等等,具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
C# 漢字轉(zhuǎn)拼音(全拼和首字母)實(shí)例
這篇文章介紹了C# 漢字轉(zhuǎn)拼音(全拼和首字母)實(shí)例代碼,有需要的朋友可以參考一下2013-10-10
Unity實(shí)現(xiàn)卡牌翻動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)卡牌翻動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

