《C#程序設計基礎教程》課件第5章_第1頁
《C#程序設計基礎教程》課件第5章_第2頁
《C#程序設計基礎教程》課件第5章_第3頁
《C#程序設計基礎教程》課件第5章_第4頁
《C#程序設計基礎教程》課件第5章_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章WinForm基礎(二)5.1控件5.2電影信息管理窗體5.3菜單5.4窗體互操作5.5用戶自定義選項

5.1控件

5.1.1選擇控件在實際的開發(fā)過程中,選擇也是經(jīng)常會碰到的一種操作類型,事實上我們在設計程序的時候一般都會優(yōu)先考慮讓用戶進行選擇操作而不是輸入操作,因為選擇操作是我們可以控制的,而輸入操作我們無法控制。選擇操作分為單選和多選,在WinForm中分別采用RadioButton控件和CheckBox控件來實現(xiàn)。這兩個控件的屬性幾乎是一樣的,常用的屬性有兩個:Checked:控件是否處于選中狀態(tài)。Text:呈現(xiàn)在控件上的文本信息。RadioButton和CheckBox這兩個控件都沒有常用的方法,而對于常用的事件兩者是不一樣的。RadioButton控件的常用事件是Click,即控件被單擊的時候所觸發(fā)的事件,而CheckBox控件的常用事件是CheckedChanged,即控件的選中狀態(tài)發(fā)生變化時所觸發(fā)的事件。有一點需要特別說明,在窗體上CheckBox控件是可以同時存在多組的,但是RadioButton則特殊一些,在同一個容器中只能存在一組,也就是說如果不借助于其他控件,窗體上只能有一組RadioButton控件。如果需要在窗體上放置多組RadioButton控件,則需要借助于容器控件,常用的容器控件有GroupBox和Panel,在使用的時候首先把容器控件放置在窗體上,然后將RadioButton控件放置在容器空間中就可以了。CheckBox控件所使用的默認事件是CheckedChanged,即選中狀態(tài)發(fā)生變化時所觸發(fā)的事件,當我們需要根據(jù)用戶的選擇來完成不同的操作時可以使用該事件,一般來說在使用的時候都要對控件的Checked屬性進行判斷。RadioButton控件則有所不同,雖然其默認事件也是CheckedChanged,但是在開發(fā)的過程中其Click事件反倒用得更多些,這是因為對于CheckBox控件來說,單擊可能是幾種不同的狀態(tài),而RadioButton控件只要是單擊,就一定會是選中的狀態(tài),這樣就省去了狀態(tài)判斷的過程了。5.1.2列表控件列表控件也是提供用戶選擇的控件,只是更加“節(jié)省”空間。常用的列表控件有ComboBox和ListBox兩個,前者提供單選,后者提供多選。對于這兩個控件我們主要關注三個方面:如何設定選擇項、如何獲取選擇項以及如何刪除選擇項。1.設定選擇項ComboBox和ListBox都具有一個Items屬性,它們的選擇項就存放在這個屬性中,設定的方式有兩種:通過編輯器編輯和通過代碼設定。當我們通過編輯器編輯選擇項的時候,首先需要找到Items屬性,點擊后面的按鈕就可以打開選擇項編輯器,剩下的任務是在編輯器中寫下我們所要提供出來的選項即可,如圖5-4所示。通過這種方式設定的選項很難根據(jù)實際情況發(fā)生變化,如果需要動態(tài)設置選項內容,就需要通過代碼的方式來完成:privatevoidfrmExample_Load(objectsender,EventArgse){comboBox1.Items.Add("開發(fā)部");comboBox1.Items.Add("銷售部");comboBox1.Items.Add("后勤部");comboBox1.Items.Add("售后服務部");comboBox1.Items.Add("總經(jīng)辦");}在上面的代碼中,我們通過調用ComboBox控件Items屬性的Add()方法來完成動態(tài)添加選擇項的任務。在使用Add()方法的時候,我們將需要添加的選擇項作為一個字符串參數(shù)傳遞給該方法就可以了。如果要設定ListBox控件,只需要將上述代碼中的comboBox1替換成ListBox控件的名稱即可。即使這樣,這兩個控件還是有一些明顯的差別的。對于ComboBox控件來說,其最有趣的就是DropDownStyle屬性了,事實上這個控件可以看做是TextBox和ListBox兩個控件結合在一起而成的,因此它可能表現(xiàn)出多種不同的樣式,而這個屬性就是用來設定其樣式的,它有三個取值:Simple:控件表現(xiàn)為文本框樣式,可以輸入或通過鍵盤上下鍵選擇選項。DropDown:默認樣式,控件表現(xiàn)為帶下拉鍵的樣式,可以輸入或通過鼠標選擇選項。DropDownList:控件表現(xiàn)為帶下拉鍵的樣式,但只能夠通過鼠標選擇選項。以上三種樣式的運行結果如圖5-6所示。對于ListBox控件來說,需要特別注意它的SelectionMode屬性,這個屬性是用來設定ListBox控件的選擇模式的,它有四個取值:None:控件無法選擇任何內容。One:默認值,控件只能選中一個選項。MultiSimple:控件可以選中多個選項,操作方式為點擊后選中,再次點擊后取消選中狀態(tài)。MultiExtended:控件可以選中多個選項,操作方式為鼠標拖動選擇,點擊控件任意位置后取消選中狀態(tài)。以上四種狀態(tài)的運行效果如圖5-7所示。2.獲取選擇項因為ComboBox控件是單項選擇的控件,所以其取值比較簡單,直接通過Text屬性就可以取得用戶選擇項的值:stringstr=comboBox1.Text;對于ListBox控件來說就麻煩一些了,因為它是可以多選的,所以就必須通過一個循環(huán)的方式來取得用戶所有的選擇項,并且將結果進行組合才能夠得到最終的結果:stringstr="";for(inti=0;i<listBox4.SelectedItems.Count;i++){str+=listBox4.SelectedItems[i].ToString()+";";}在上面的代碼中我們通過一個循環(huán)結構來讀取用戶的選中信息,對于ListBox控件來說,用戶的選擇項被放在了SelectItems屬性中,因此我們才需要一個循環(huán)結構。3.刪除選擇項列表控件的選擇項同樣可以動態(tài)刪除,所使用的是Items屬性的兩個方法:Remove:刪除Items中指定的選擇項。RemoveAt:刪除Items中指定下標的選擇項。對于ComboBox控件來說,使用哪個方法都一樣,但是對于ListBox控件來說,RemoveAt()方法使用得將會更多一些:for(inti=listBox1.SelectedIndices.Count-1;i>-1;i--){listBox1.Items.RemoveAt(listBox1.SelectedIndices[i]);}仔細觀察上面的代碼會發(fā)現(xiàn),有兩個地方比較引人注目。首先,我們用到了一個新的屬性SelectedIndices,它包含了ListBox控件中所有選擇項的下標。另一個重要的地方就是,在執(zhí)行刪除操作的時候一定要從后向前刪除,因為如果從前向后刪除,則每刪除一個項,其他項的下標就會發(fā)生變化。另外,我們也可以使用Items屬性的Clear()方法來清除所有的選擇項。ComboBox控件的默認事件是SelectedIndexChanged,即選中項下標發(fā)生變化時所觸發(fā)的事件,如果我們需要根據(jù)用戶不同的選擇來完成不同的操作時就可以使用該事件。ListBox控件雖然也有很多事件,但是在實際開發(fā)的過程中一般很少用到,原因很簡單:如果用戶每次操作都會觸發(fā)事件處理程序,就會嚴重影響到執(zhí)行效率,所以我們都是在用戶選擇完成后再處理。

5.2電影信息管理窗體

5.2.1問題這一次我們將制作一個管理電影對象的窗體,窗體的運行效果如圖5-8所示。這只是一個簡單的窗體,并不能完成具體的功能,但是也有很多需求:(1)窗體不能最大化和最小化。(2)窗體不能改變大小。(3)首次運行的時候窗體在屏幕正中。(4)地區(qū)下拉列表只能選擇不能輸入。(5)主演為多行文本框。(6)簡介為RichTextBox。5.2.2需求分析1.控件設置由于涉及的控件比較多,因此我們通過表5-1加以說明。2.界面操作在進行界面設計的時候,最煩惱的莫過于控件的對齊和間距了,在VS2010中,我們可以通過“格式(O)”菜單下的一些操作來制作界面。選中界面中的多個元素,通過菜單格式→對齊→左對齊,就可以調整多個元素,如圖5-9所示。調整前后如圖5-10所示。除了左對齊之外,當然還可以選擇右對齊或者中間對齊,如果是橫向的,則可以選擇頂端對齊或者底端對齊等。另外,如果希望控件的間距相等,則可以通過菜單中的“水平間距(H)”或者“垂直間距(V)”來調整。如果是單個控件,系統(tǒng)有另外一種更加便捷的方式來幫助我們調整控件:選中一個控件,把它拖動到希望對齊的另一個控件旁邊,系統(tǒng)就會自動出現(xiàn)對齊線。

5.3菜單

Windows應用程序還有一個重要的特征:菜單。菜單一般都會出現(xiàn)在界面的頂端,其作用就是用很小的空間里將系統(tǒng)的功能進行分類,然后呈現(xiàn)在用戶的面前。在WinForm中,菜單分為兩種:主菜單和上下文菜單。5.3.1主菜單主菜單放置在窗體的頂部,提供整個系統(tǒng)的完整功能展示。制作菜單很簡單,在工具箱的“菜單和工具欄”選項卡中找到“MenuStrip”項,將其拖曳到窗體上。這時在窗體的底部就會有一個單獨的區(qū)域用來存放MenuStrip對象,其實這個區(qū)域我們在前面使用Timer對象的時候曾經(jīng)出現(xiàn)過,它主要是用來盛放那些運行的時候不需要顯示出來的控件的,例如Timer、MenuStrip等。同時,在窗體的頂部就會出現(xiàn)一個菜單編輯器。在WinForm中,菜單的編輯制作是一個所見即所得的過程,也就是說我們編輯的菜單是什么樣子的,那么運行的效果就是什么樣子的。在WinForm中所有的菜單都是ToolStripMenuItem對象,它的使用和普通的控件是一樣的,因此我們還是從屬性開始來認識菜單對象。選中一個菜單對象后,我們就可以在屬性窗口中看到其常用的屬性,這里只需要了解以下幾個屬性:Name:菜單對象在代碼中的唯一名稱,一般采用mnu作為前綴。Text:菜單對象上呈現(xiàn)出來的說明性文字,當文本為“-”符號時就呈現(xiàn)出一條分割線。ShortcutKeys:與菜單項相關聯(lián)的快捷鍵設置,這里可以選擇組合的快捷鍵。在使用主菜單時需要注意以下幾點:(1)快捷鍵應當盡可能按照我們的日常習慣來設置,并且不和系統(tǒng)的常用快捷鍵相沖突。(2)盡管沒有規(guī)定,但是菜單最好不要設置超過三層,否則使用起來會很麻煩。(3)盡量合理地規(guī)劃和組織菜單,這會給用戶帶來很大的便利。菜單對象沒有常用的方法,常用的事件是Click,即菜單被單擊時所觸發(fā)的事件。5.3.2上下文菜單除了主菜單之外,在WinForm中還有一種稱為上下文菜單的對象:ContentMenuStrip。這種菜單對象主要是用來實現(xiàn)右鍵彈出式菜單的。一般情況下,Windows應用程序中的某些界面對象系統(tǒng)會自動添加右鍵彈出菜單,但是如果我們需要自己定制這個菜單,就要借助于ContextMenuStrip對象了。制作上下文菜單的過程很簡單。首先在工具箱中找到上下文菜單,雙擊或將其拖曳到窗體上,這時就會在窗體上添加一個名稱為contextMenuStrip1的對象,因為它也是由ToolStripMenuItem對象所組成的,所以其制作過程和制作主菜單的過程是一樣的。當我們設置好ContextMenuStrip后,就可以使用它了。在窗體上放置一個控件,例如放置一個TextBox控件,然后查找其ContextMenuStrip屬性,在其下拉框中就可以看到我們剛才所添加的contextMenuStrip1對象了,如圖5-14所示。這樣我們就可以將兩個控件鏈接在一起了。運行程序即可看到我們制作的菜單替換了系統(tǒng)原來的菜單,如圖5-15所示。

5.4窗體互操作

一個完整的應用程序不可能只有一個窗體,而是由多個不同的窗體組合而成的,每個窗體負責一個簡單的小模塊,最終組合為一個完整的應用程序。既然是多個窗體,那么就有窗體之間的互操作,常見的互操作有跳轉、傳參和返回。5.4.1跳轉窗體間的跳轉就是通過在一個窗體上執(zhí)行一些操作來打開另外一個窗體。這個過程其實也不難,只需要以下兩步:(1)通過new關鍵字創(chuàng)建新窗體的一個對象:frmFilmManagefm=newfrmFilmManage();(2)通過調用新窗體對象Show()方法來打開新窗體,運行效果如圖5-16所示。fm.Show();當然這只是最簡單的操作,通過這種方式所打開的窗體被稱為非模式窗體,也就是說用戶完全不理會這個新窗體而不會影響到用戶的操作。如果需要用戶必須對新窗體做出響應,我們可以采用ShowDialog()方法:fm.ShowDialog();采用這種方式打開的窗體稱為模式窗體。模式窗體要求用戶必須做出響應,在這個窗體未關閉之前用戶是無法操作其他窗體的。另一個比較有趣的地方是,當通過一個按鈕來打開新窗體的時候,我們會發(fā)現(xiàn)反復點擊按鈕可以打開多個窗體,也就是同時創(chuàng)建多個新窗體對象,這不但讓程序看起來很不友好,而且也會讓用戶變得很困惑。如何避免這種情況呢?這個過程稍微有點復雜。首先我們必須將剛才的對象聲明語句從按鈕的Click事件處理程序中取出來,放置到類當中使對象窗體成為一個類成員變量:publicpartialclassfrmFilmList:Form{frmFilmManagefm=null;//其他代碼}然后將按鈕的Click事件處理程序做如下修改:privatevoidbtnEdit_Click(objectsender,EventArgse){if((fm==null)||(fm.IsDisposed)){fm=newfrmFilmManage();fm.Show();}elsefm.Show();}在上面的代碼中,我們增加了一個if結構,通過對兩個條件的判斷來決定是否需要對窗體對象進行實例化的操作。事實上,仔細分析一下我們就會知道只有在兩種情況下窗體才需要進行實例化:第一次打開和關閉后再次打開,除此之外都不需要進行實例化操作。因此,在這個if結構中我們添加了兩個條件,第一個條件fm==null判斷窗體是否是第一次打開,第二個條件fm.IsDisposed則是用來判斷窗體是否已經(jīng)被關閉了。IsDisposed是窗體的一個屬性,用來標識窗體對象是否已經(jīng)被釋放,也就是說窗體是否關閉了。經(jīng)過這樣的改造后,不管點擊多少次按鈕,窗體就只能夠被打開一次。5.4.2傳參窗體間另一個比較常見的互操作是傳遞參數(shù)(傳參),即將參數(shù)從一個窗體傳遞到另外一個窗體。一般來說傳參的操作都是建立在跳轉的基礎之上的。理論上說,要想從A窗體將數(shù)據(jù)傳遞到B窗體,那么B窗體首先必須要有公開的數(shù)據(jù)接口,也就是要有外部用戶能夠訪問到的可賦值成員。對于窗體來說,那就意味著窗體類需要定義一些公有的成員以便于外部用戶訪問。一旦B窗體定義了這些公有的成員,那么A窗體就可以通過B窗體的對象來完成賦值操作,也就完成了數(shù)據(jù)的傳遞工作。實際操作該如何完成呢?通過上面的分析我們可以看到,實際上問題的焦點在于B窗體類所定義的公有成員身上。類的公有成員有很多,一般常用的是屬性、方法和構造三種方式。當然,不管采用哪種方式,都需要B窗體有一個字段來存放數(shù)據(jù)。首先在B窗體中定義一個私有的字段用來存放數(shù)據(jù):publicpartialclassfrmFilmManage:Form{//用戶存放數(shù)據(jù)的私有字段privatestringfilmName=null;//其他處理代碼}接下來將這個字段公開出去,這樣就能夠用來接收數(shù)據(jù)了。我們可以采用屬性:publicstringFilmName{get{returnthis.filmName;}set{filmName=value;}}也可以采用方法來公開它:publicvoidSetFilmName(stringname){filmName=name;}還可以采用構造來完成這個工作:publicfrmFilmManage(stringname){InitializeComponent();filmName=name;}這里需要注意一點,在使用構造的時候最好將給字段賦值的語句寫在InitializeComponent()方法的后面,因為這個方法是用來初始化窗體成員對象的,如果寫在這個方法的前面,有可能會出現(xiàn)找不到對象的情況。完成了這些工作之后,我們就可以通過A窗體來完成傳參工作了://構造傳參frmFilmManagefm=newfrmFilmManage("那些年,我們一起追過的女孩");//屬性傳參fm.FilmName="那些年,我們一起追過的女孩";//方法傳參fm.SetFilmName("那些年,我們一起追過的女孩");fm.Show();上面我們將三種實現(xiàn)方式放在了一起,究竟要采用哪種方式要根據(jù)實際情況來定。5.4.3返回傳參是將數(shù)據(jù)從A窗體傳遞到B窗體,返回則是將數(shù)據(jù)從B窗體傳遞回A窗體。這個過程實際上和傳參很相似,實現(xiàn)思路基本上是一樣的。我們依然需要在B窗體中定義一個字段,只不過現(xiàn)在為這個字段賦值的工作需要在B窗體中完成,然后通過公有成員公開字段的值,這樣A窗體就可以讀取到字段的值了。首先在B窗體中定義一個字段:publicpartialclassfrmFilmManage:Form{//用戶存放數(shù)據(jù)的私有字段privatestringfilmName=null;//其他處理代碼}然后在程序中為該字段賦值:privatevoidbtnSave_Click(objectsender,EventArgse){filmName="那些年,我們一起追過的女孩";}接下來采用屬性或方法將字段公開出去://屬性publicstringFilmName{get{returnthis.filmName;}set{filmName=value;}}//方法publicstringGetFilmName(){returnfilmName;}最后,在A窗體中完成取值操作:frmFilmManagefm=newfrmFilmManage();fm.ShowDialog();//方法返回txtName.Text=fm.GetFilmName();//屬性返回txtName.Text=fm.FilmName;在上面的代碼中,比較突出的是我們在打開窗體時采用了ShowDialog()方法,這是為什么呢?我們知道ShowDialog()方法打開的是一個模式窗體,也就是用戶必須做出響應的窗體,正因為這樣,所以當程序執(zhí)行到這里的時候就會“?!毕聛?,等待用戶的響應,也就是說這個時候如果用戶不做出響應那么后面的代碼是不會執(zhí)行的。這樣,用戶就有時間為字段賦值,后面的取值操作才能夠成立。如果采用Show()方法,程序就不會“?!毕聛恚脩暨€沒來得及為字段賦值,后面的取值操作就執(zhí)行了,自然就不可能取到值了。

5.5用戶自定義選項

5.5.1問題為了推廣音像店,我們需要制作一套會員系統(tǒng)。在會員注冊的過程中,需要會員選擇自己的興趣愛好,問題是我們很難

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論