版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第五章本書學(xué)習(xí)情境:書店管理系統(tǒng)界面設(shè)計
5.1學(xué)習(xí)情境引入
我們學(xué)習(xí)了C#語言的基本語法,就可以開始用計算機能“理解”的語言表達我們的邏輯思想了,在不斷的運用中,逐漸熟練掌握這些語法。開發(fā)單機用的“書店管理系統(tǒng)”,除了要用計算機語言描述程序邏輯并寫出一段程序外,還要設(shè)計程序的用戶界面。書店管理系統(tǒng)就是由一個一個的窗體界面組成的,也就是Windows程序窗體界面。友好的窗體界面可以極大地提高人機對話能力,因此窗體界面的設(shè)計對應(yīng)用程序而言是極其重要的5.1.1項目需求
根據(jù)書店管理系統(tǒng)項目需求分析,該項目包括登錄窗口、主窗體、采購管理、銷售管理、倉儲管理等界面。1.登錄窗口要保證系統(tǒng)的安全性,就需要在使用系統(tǒng)前進行安全身份驗證。一般通過輸入用戶名和密碼的形式進行驗證,并在登錄后記錄當前用戶及其角色。2.主窗體界面作為一個書店管理系統(tǒng),結(jié)合實際需求分析可知,它要完成的主要業(yè)務(wù)有采購、倉儲、銷售、財務(wù)。系統(tǒng)應(yīng)具有供店員完成進書及銷售等一系列工作的操作,以及對書店財務(wù)賬目的操作和管理的功能模塊,并且每個模塊下又有許多子功能。3.采購管理采購模塊供采購人員使用,完成圖書信息錄入、打印入庫單的工作,并可以查詢以往采購的圖書信息和入庫單信息。為了在多次采購?fù)悎D書時,避免重復(fù)錄入煩瑣的圖書信息,要在采購模塊中設(shè)置書目管理子模塊,對采購的圖書信息進行管理,包括錄入、查詢、修改圖書信息等功能。在填寫入庫單時,只需調(diào)用已有的書目信息,即可避免重復(fù)錄入。入庫單管理子模塊包括填寫、打印入庫單等功能。對已經(jīng)打印、填寫錯誤的出庫單,只要倉庫管理員未執(zhí)行出庫,銷售人員還可以修改,但不允許刪除。4.銷售模塊銷售模塊包含銷售統(tǒng)計和出庫單管理兩個子模塊,供銷售人員填寫、打印出庫單,并進行銷售統(tǒng)計。對已經(jīng)打印、填寫錯誤的出庫單,只要倉庫管理員未執(zhí)行出庫,銷售人員還可以修改,但不允許刪除。銷售統(tǒng)計是指統(tǒng)計某個時段的暢銷書和滯銷書等,需要訪問出庫單表獲取銷售信息并訪問庫存表獲取價格信息。5.倉儲管理庫存模塊供倉庫管理員憑入庫單/出庫單執(zhí)行入庫/出庫以及庫存查詢功能。5.1.2展示
1.登錄窗口圖5?1登錄窗口界面設(shè)計書店登錄窗口的主要作用是接收用戶的相關(guān)信息,用于驗證用戶的身份并為用戶創(chuàng)建相應(yīng)的用戶書店管理目錄環(huán)境。所以界面中加有兩個文本框和兩個按鈕及兩個標簽,如圖5-1所示2.書店管理系統(tǒng)主界面建立書店管理系統(tǒng)的主界面,界面中加有菜單欄,如圖5-2所示。3.書店管理系統(tǒng)添加圖書信息界面添加圖書信息界面中有標簽、文本框、按鈕、圖片框等控件,主要完成圖書信息的錄入,如圖5-3所示。5.1.3技術(shù)分解
項目展示的3個窗體界面從技術(shù)上講每一個界面就是一個控件,界面內(nèi)的每一個元素又是一個控件。在這里窗體界面是其他控件的一個容器,在這個容器中包含了其他控件。如圖5-4所示的登錄窗體界面,主界面是Form控件,F(xiàn)orm控件內(nèi)有Label控件(歡迎使用書店管理系統(tǒng)、用戶名:密碼:)、TextBox控件(界面中的輸入文本框)、Button控件(確定、取消按鈕),如圖5-4所示。同樣道理的書店管理系統(tǒng)的其他界面也是由控件組成的,只是所用的控件不同而已。從某種意義上講,書店管理系統(tǒng)界面設(shè)計,就是如何合理地使用控件來完成所設(shè)計功能的過程。通過本章的學(xué)習(xí),我們可以設(shè)計由多個窗體組成的書店管理信息系統(tǒng)。開發(fā)平臺為我們提供了很多控件,各控件有不同的屬性、事件、方法,但是書店管理系統(tǒng)用到的控件種類有限。希望初學(xué)者注意從最常用的開始學(xué)習(xí),逐漸舉一反三,并培養(yǎng)自己利用MSDN來學(xué)習(xí)其他更多控件使用方法的良好習(xí)慣。本章需要了解的基本知識如下?!?控件的基本概念?!?窗體的方法、屬性及事件?!?常用的幾類控件的方法、屬性及事件?;局R1:控件類
5.2.1控件類的屬性、方法和事件控件(Controls)是完成用戶交互的組件??丶梢蕴峁┨幚頂?shù)據(jù)、接收用戶輸入、對事件做出響應(yīng)或執(zhí)行連接用戶和應(yīng)用程序等其他功能??丶举|(zhì)上是具有圖形接口的組件,所以它能提供組件所提供的功能并與用戶進行交互。VS.NET2008提供了豐富的窗體控件,“工具箱”中的“所有Windows窗體”里面包含了所有Windows窗體的標準控件,像標簽控件(Label)、按鈕控件(Button)、文本框控件(TextBox)等,工具箱中的每個控件都對應(yīng)一個類,這些類均派生自System.Windows.Forms.Control類。作為各種窗體控件的基類,Control類實現(xiàn)了所有窗體交互控件的基本功能,如處理鍵盤輸入、處理消息驅(qū)動、限制控件大小等。.NET已經(jīng)為我們設(shè)計好工具箱中的控件類,初學(xué)者的任務(wù)是學(xué)會使用這些類的公開成員,并將各種不同的控件,組合在一個窗體中,也就是設(shè)計一個新的窗體類。學(xué)習(xí)窗體和其他控件的使用,就是學(xué)習(xí)它們的屬性、方法和事件。1.屬性如上一章所述,屬性公開了類的數(shù)據(jù)成員。比如控件的名稱,數(shù)據(jù)成員公開為Name屬性。獲取某個控件的Name也就得到了控件的名稱;給某個控件的Name賦值,也就更改了控件的名稱??丶膶傩院芏啵鏣ext屬性對應(yīng)控件上顯示的文字、ForeColor屬性對應(yīng)控件上文字的顯示顏色等。C#是強類型語言,對屬性值的操作必須類型匹配。例如,設(shè)置textBox1控件的Text屬性。textBox1.Text="Helloworld!";//這是正確的。textBox1.Text=123;//這是錯誤的,因為123是Int32類型,而TextBox控件的Text屬性是String類型的。因此,要了解屬性的含義及其數(shù)據(jù)類型。圖5?5Windows窗體的屬性面板在VisualStudio.NET中,可以直接在屬性面板上更改屬性的值。屬性面板一般在窗口右邊,可以按F4鍵顯示,或操作菜單“視圖|屬性窗口”,如圖5-5所示。2.方法方法是一個執(zhí)行對象的行為的成員。程序員要實現(xiàn)用戶要求的邏輯功能,經(jīng)常會調(diào)用某個類的方法,來使對象完成某種行為。方法有一個形式參數(shù)列表(可能為空)和一個返回數(shù)值(或void),并且可以是靜態(tài)也可以是非靜態(tài)。靜態(tài)方法要通過類來訪問。非靜態(tài)方法,也稱為實例方法,要通過類的實例(對象)來訪問。方法可以被重載,這意味著多個方法可能有相同的名稱。程序員應(yīng)主要掌握常用方法的參數(shù)和返回值。3.事件控件的事件,對應(yīng)著控件從初始化到和用戶交互以至最后銷毀,所經(jīng)歷的各個發(fā)展階段??丶拿總€事件,都對應(yīng)著特定的時機。比如Button類控件的Click事件,在用戶單擊此按鈕時發(fā)生;再如Form類的Load事件,在窗體初始化后、還未顯示時發(fā)生。每個事件發(fā)生時,都會自動執(zhí)行關(guān)聯(lián)的一個(或多個)方法,這個方法稱為事件委托函數(shù),該函數(shù)的參數(shù)是事件發(fā)生時的環(huán)境參數(shù)。當然,前提是程序員事先編好了這樣的方法,并指定了此方法和某個事件關(guān)聯(lián)。選擇合適的事件,編寫事件委托函數(shù),是Windows窗體程序設(shè)計的工作線索。例如,要求在窗體顯示之前用程序設(shè)置窗體的標題欄為“歡迎”,我們應(yīng)該選擇Form的Load事件,而不是Button的Click事件。程序員要了解事件發(fā)生的時機和事件的參數(shù)。在VisualStudio.NET2008的可視化設(shè)計界面中,把選中對象的所有事件都列了出來,集中在屬性面板的事件列表中,如圖5-6所示。在這個事件列表中,左邊是這個對象支持的事件,右邊是這個事件發(fā)生時要執(zhí)行的方法。如果是空的,那么這個對象將不對這個事件做出反應(yīng)。因此,事件和方法可以通過這里連接起來。在.NET中,只要雙擊事件的名稱,系統(tǒng)就會把這個事件默認的處理方法和這個事件關(guān)聯(lián)起來,即前述的事件委托。比如,雙擊Click事件,屬性欄就會變?yōu)槿鐖D5-7所示的形式。在Form1.Designer.cs文件中,窗體設(shè)計器生成的代碼里,則會自動出現(xiàn)以下語句,該語句和圖5-7中的事件表格是一致的:刪除此句,屬性面板中的“Form1_Load”就會自動消失;清除屬性面板中的“Form1_Load”,下面的語句就會被自動刪除。
this.Load+=newSystem.EventHandler(this.Form1_Load);出現(xiàn)上面的語句時,Load事件和Form1_Load方法就關(guān)聯(lián)起來,即建立了委托關(guān)系。也就是程序運行時,在發(fā)生窗體Form1被用戶Load的事件時,就會自動執(zhí)行Form1_Load方法。與此同時,系統(tǒng)會在Form1.cs文件中自動添加Form1_Load方法的聲明,代碼如下。privatevoidForm1_Load(objectsender,EventArgse){}該方法有兩個參數(shù),第一個是object類型,代表發(fā)生事件的對象,此處為Form1對象;第二個是EventArgs類型,代表發(fā)生Load事件時的環(huán)境參數(shù)。只要在此方法中寫入:this.Text=”歡迎”;就可以實現(xiàn)在窗體顯示之前,用程序設(shè)置窗體的標題欄為“歡迎”的功能了。5.2.2自測
1.思考題(1)在VisualStudio.NET中,如何設(shè)置控件的屬性?(2)在VisualStudio.NET中,如何應(yīng)用控件的事件?并舉例說明?;局R2:Form類
C#中的Windows應(yīng)用程序是以窗體(Form)為基礎(chǔ)的。Windows窗體是組成應(yīng)用程序用戶界面的窗口或?qū)υ捒?,可用來向用戶顯示信息并接受用戶的輸入。窗體可以是標準窗口、多文檔界面(MDI)窗口、對話框等。新建Windows應(yīng)用程序模板的項目時,IDE(IntegratedDevelopmentEnvironment)將自動建立一個Form1類的窗體,它派生自Form類。窗體類可以有靜態(tài)成員,但從Form類繼承的多數(shù)屬性和方法都是實例方法,比如窗體的尺寸屬性、顯示窗體的方法等。所以,在程序運行時顯示出的窗體是由該類創(chuàng)建的實例。在程序中,用this關(guān)鍵字引用當前窗體實例。窗體是與用戶交互的主要載體,是整個Windows應(yīng)用程序的控件容器,其他界面元素(控件等)都可以放置在這個容器中。每向窗體中拖曳一個控件,設(shè)計器就為其添加一個字段的聲明和初始化,通過組合不同的控件集、設(shè)置窗體的屬性以及編寫相應(yīng)的事件、方法代碼,可以滿足用戶對應(yīng)用程序的要求。下面我們就對窗體的一些重要屬性、方法和事件進行介紹,之后會發(fā)現(xiàn)窗體是一個功能非常強大的對象。5.3.1類的繼承
C#允許一個類繼承其他類的屬性和方法。被繼承的類稱為父類(也可稱其為基類),繼承的類稱為派生或子類。子類不僅可以繼承基類的屬性和方法,還可以根據(jù)需要定義新的屬性和方法,增加新的功能。這樣可使用戶重用基類的代碼,專注于子類的新代碼,提高類的可重用性。繼承的好處是能共享代碼,繼承后,父類的所有字段和方法都將存在于子類中,每一個子類都具有父類的非私有特性。在有些語言中,子類可以從不止一個父類中派生,稱為多繼承。但在C#中,子類僅能派生于一個父類。1.繼承的定義
如果要聲明一個類派生于另一個類,可以使用下面的語法:[修飾符]class派生類名:基類名{//派生類成員}修飾符:可選擇public、internal、abstract、sealed、new、private、protected修飾符,使用時根據(jù)需要確定。派生類名:必須是一個有效的C#標識符,一般采用Pascal大小寫命名規(guī)則,單詞的第一個字母大寫?;惷罕焕^承的類的名。類體:用于定義派生類的成員。繼承意味著一個類隱藏了除了構(gòu)造函數(shù)和析構(gòu)函數(shù)外基類的所有成員。關(guān)于繼承,需要注意以下幾點?!?繼承是可傳遞的。如果C從B中派生,B又從A中派生,那么C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object類是所有類的基類?!?派生類應(yīng)當是對基類的擴展。派生類可以添加新的成員,但不能除去基類的成員的定義?!?構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承。除此以外的其他成員,不論對它們定義了怎樣的訪問方式,都能被繼承?!?派生類如果定義了與繼承而來的成員同名的新成員,可以覆蓋已繼承的成員。但這并不是在派生類中刪除了這些成員,而只是不能再訪問這些成員。● 類可以定義虛方法、虛屬性以及虛索引指示器,它的派生類能夠重載這些成員,從而實現(xiàn)類的多態(tài)性?!?派生類的成員有兩個來源:一個是從基類中繼承來的;另一個是在派生類中重新定義的?!纠?-1】下面的例子演示了繼承的定義。usingSystem;namespaceExample5_1{//定義基類
publicclassUser{protectedstringname;//姓名,保護成員
protectedstringpassWord;//用戶密碼,保護成員
privatestringrole;//身份,私有成員
publicPerson(stringu_name,stringu_passWord,stringu_role)//構(gòu)造函數(shù)
{passWord=u_passWord;name=u_name;role=u_role;}}//派生類定義
publicclassEmployee:User{publicstringid;//在派生類中填加用戶的編號公共成員
publicEmployee(stringu_name,stringu_passWord,stringu_role,stringe_id):base(u_name,u_passWord,u_role)//構(gòu)造函數(shù)
{id=e_id;}
}classClass1{[STAThread]staticvoidMain(string[]args){//用派類創(chuàng)建對象
EmployeeliMing=newEmployee("liMing","123","經(jīng)理","8888");
}}}程序分析如下?;怳ser定義了兩個數(shù)據(jù)成員,一個構(gòu)造函數(shù),對基類不做重點分析,重點分析Employee派生類。publicclassEmployee:User的含義是:public表示公共的;class是類關(guān)鍵字;Employee是派生類名稱;“::”表示派生于;User是基類名。類體部分:增加一個公共成員id(表示雇員的編號),增加一個構(gòu)造函數(shù)初始化對象的成員(注意派生類的構(gòu)造函數(shù)的定義)。在Employee派生類的類體部分看不到基類的代碼,但是派生類Employee已經(jīng)繼承了基類User的成員,也就是說基類的成員也是派生類的成員。2.定義派生類的構(gòu)造函數(shù)
由于派生類是繼承基類的成員,因此,在創(chuàng)建一個派生類對象時,不僅要對派生類中新增加的成員進行初始化,還要對基類中的數(shù)據(jù)進行初始化。定義派生的類的構(gòu)造函數(shù)的一般形式如下。[修飾符]派生類類名(參數(shù)表1):base(參數(shù)表2){//派生類初始代碼}由于派生類是繼承基類的成員,因此,在創(chuàng)建一個派生類對象時,不僅要對派生類中新增加的成員進行初始化,還要對基類中的數(shù)據(jù)進行初始化。定義派生的類的構(gòu)造函數(shù)的一般形式如下。[修飾符]派生類類名(參數(shù)表1):base(參數(shù)表2){//派生類初始代碼}參數(shù)表1:指明參數(shù)的名稱和類型,包含派生類新增參數(shù)及基類的參數(shù),也可以無參數(shù)。base:基類關(guān)鍵字表示基類,關(guān)鍵字base為調(diào)用基類的成員提供了一個簡便的方法,調(diào)用基類成員采用的格式為base.成員名。參數(shù)表2:指明基類參數(shù)的名稱無需類型說明,這些參數(shù)應(yīng)包含在參數(shù)表1中。派生類初始代碼:由語句組成,用于所要執(zhí)行的操作。【例5-2】下面的示例說明了派生類的構(gòu)造函數(shù)定義。publicclassMyRole//基類MyRole{privateintx;privateinty;publicMyRole(intxx,intyy)//基類構(gòu)造函數(shù)
{x=xx;y=yy;}}publicclassMyDerived:MyRole//派生MyDerived{privateintz;publicMyDerived(intxx,intyy,intzz):base(xx,yy)//派生類構(gòu)造函數(shù)
{z=zz;}}在派生類的構(gòu)造函數(shù)MyDerived(intxx,intyy,intzz)中,用參數(shù)xx、yy調(diào)用基類的構(gòu)造函數(shù)初始化基類的數(shù)據(jù),而用參數(shù)zz初始化派生類中的數(shù)據(jù)成員。派生類的構(gòu)造函數(shù)有如下特點。(1)派生類的構(gòu)造函數(shù)可以重載,以調(diào)用基類的不同構(gòu)造函數(shù)。(2)派生類的構(gòu)造函數(shù)體內(nèi)一般只初始化派生類的數(shù)據(jù)函數(shù),而不直接初始化基類成員,即使能直接訪問它們。注意:在創(chuàng)建對象時,調(diào)用派生類的構(gòu)造函數(shù)MyDerived(intxx,intyy,intzz),不必帶有:base(xx,yy),MyDerivedmyTest=newMyDerived(1,2,3)。3.使用new修飾符隱藏基類成員
使用new修飾符可以顯式隱藏從基類繼承的成員,這樣在使用派生類的對象的方法時,調(diào)用的是派生類重寫的與派生類相同的新方法。若要隱藏繼承的成員,使用相同名稱在派生類中聲明該成員,并用new修飾符修飾它即可??聪旅娴念悺ublicclassMyBase{publicintx;publicvoidMyVoke(){Console.WriteLine("ThisisMybase”);}}在派生類中用MyVoke名稱聲明成員會隱藏基類中的MyVoke方法。publicclassMyDerived:MyBase{newpublicvoidMyVoke(){Console.WriteLine("ThisisMyDerived”);}}注意:在同一成員上同時使用new和override是錯誤的。要調(diào)用隱藏的基類中的方法用下列方法:base.基類隱藏的方法。4.密封類和密封方法
C#允許把類和方法聲明為sealed。對于類來說,這表示不能繼承該類;對于方法來說,這表示不能重寫該方法。sealedclassFinalClass{//代碼}classDerivedClass:FinalClass//這將給出編譯錯誤,因密封類不能派生{//代碼}在把類或方法標記為sealed時,最可能的情形是:如果要對庫、類或自己編寫的其他類進行操作,則重寫某些功能會導(dǎo)致錯誤。也可以因商業(yè)原因把類或方法標記為sealed,以防第三方以違反注冊協(xié)議的方式擴展該類。但一般情況下,在把類或方法標記為sealed時要小心,因為這么做會嚴重限制它的使用。即使不希望能繼承一個類或重寫類的某個成員,仍有可能在將來的某個時刻,有人會遇到我們沒有預(yù)料到的情形。.NET基類庫大量使用了密封類,使希望從這些類中派生出自己的類的第三方開發(fā)人員無法訪問這些類。例如string就是一個密封類。把方法聲明為sealed也可以實現(xiàn)類似的目的,但很少這么做。5.抽象類和抽象函數(shù)C#允許把類和函數(shù)聲明為abstract,抽象類不能實例化,而抽象函數(shù)沒有執(zhí)行代碼,函數(shù)括號后跟一個分號,必須在非抽象的派生類中重寫。如果類包含抽象函數(shù),該類也是抽象的,必須聲明為抽象的。abstractclassBuilding{publicabstractdecimalCalculateHeatingCost(); //abstractmethod}5.3.2Form類的常用屬性、方法和事件
1.Form類的常用屬性屬性就是一組設(shè)置值,用于描述某類對象(如窗體Form)的外觀、形狀、大小、位置等。對于窗體(Form類),許多屬性可以在設(shè)計時用屬性窗口(如圖5-8所示)來設(shè)置,幾乎所有屬性都可以在運行過程中通過代碼動態(tài)設(shè)置。下面我們介紹窗體的一些常用的屬性。注意:當在屬性窗口選中某屬性時,在屬性窗口的底部窗格就會顯示該屬性的簡要描述。● Text屬性。Text屬性主要用來設(shè)置窗體標題欄中顯示的文本。它可以通過屬性窗口來設(shè)置(如圖5-9中設(shè)置為“窗體的標題”),也可以在窗體運行時為Text屬性設(shè)置屬性值,代碼如下。this.Text=”窗體的標題”;可以把以上代碼放在窗體的構(gòu)造函數(shù)(該過程創(chuàng)建窗體的對象實例,具體參見“構(gòu)造函數(shù)”)中或者窗體的Load事件中。運行效果如圖5-9所示?!?FormBorderStyle屬性。FormBorderStyle屬性用來指示窗體的邊框和標題欄的外觀和行為,如圖5-10所示。在FormBorderStyle屬性窗口中有7個枚舉值,它們的具體含義如表5-1所示。枚舉常量窗口的特性Fixed3D固定的三維邊框FixedDialog固定的對話框樣式的粗邊框FixedSingle固定的單行邊框續(xù)表枚舉常量窗口的特性FixedToolWindow不可調(diào)整大小的工具窗口邊框None無邊框Sizable可調(diào)整大小的邊框SizableToolWindow可調(diào)整大小的工具窗口邊框● Name屬性。圖5?11Name屬性的可視化設(shè)置該屬性為String類型的值,用于獲取或設(shè)置窗體的名稱,該名稱主要用于在程序中引用該窗體對象。我們知道,VS默認給新建的窗體命名為Form1、Form2等。我們可以修改窗體的Name屬性,一般在設(shè)計階段即應(yīng)為所有的窗體擬定合適的名稱,并在窗體新建的第一時間就將Name屬性改定,以免中途改名帶來種種麻煩,如圖5-11所示。除了以上幾個常用屬性外,窗體屬性(例如窗體圖標、背景顏色、顯示方式等)還有很多,這里就不一一介紹了,請讀者在實驗時自行練習(xí)。2.Form類的常用方法
下面是一些最常用的窗體的方法及其用途描述。● Show:向用戶顯示窗體控件。● ShowDialog:將窗體顯示為模式對話框?!?Close:關(guān)閉窗體?!?Hide:對用戶隱藏窗體控件。.Form類的常用事件
在.NET開發(fā)環(huán)境下設(shè)計窗體時,有以下一些Form類的常用事件(含順序)?!?Init事件。初始化窗體時觸發(fā)的事件。初始化是窗體生存周期的第一步,在該事件的生存周期內(nèi)不應(yīng)該訪問其他控件,因為這些控件可能尚未生成?!?Load事件。在第一次顯示窗體前觸發(fā)Load事件?!?Activated事件。當使用代碼激活或用戶激活窗體時,就會觸發(fā)Activated事件?!?Mouse事件:MouseMove/Enter/Hover/Down/Up/Leave/Wheel等事件。這些都是與鼠標操作有關(guān)的事件,分別在鼠標指針移到窗體上、鼠標指針進入窗體、鼠標指針在窗體內(nèi)保持靜止、鼠標鍵按下、鼠標鍵釋放、鼠標移出窗體、移動鼠標滾輪時發(fā)生?!?鍵盤事件:KeyDown/Press/Up等(非字符鍵不引發(fā)KeyPress事件)。在窗體上按下鍵或釋放鍵時發(fā)生。● Closing事件。在關(guān)閉窗體時發(fā)生。● Closed事件。關(guān)閉窗體后發(fā)生。5.3.3兩個Form之間的數(shù)據(jù)傳遞
上面一節(jié)介紹了Form窗體類的主要屬性、方法和事件,下面我們來看一下如何在一個窗體上單擊一個按鈕以顯示另一個窗體。在建立好了項目之后,系統(tǒng)會自動新建一個窗體Fom1,我們可以在上面添加控件、編寫程序。當我們的應(yīng)用程序需要多個窗體時,該如何添加第2個窗體?如何控制第2個窗體呢?設(shè)計一個Windows窗體程序,首先要建立Windows應(yīng)用程序項目,分析本項目需要哪些數(shù)據(jù)和控件,然后進行設(shè)計窗體程序的“三部曲”工作:固定工具箱,在窗體上組織控件并布局;隱藏工具箱、顯示屬性面板,設(shè)計各控件的各屬性初始值;指定控件的事件委托,編寫事件委托函數(shù)及相關(guān)函數(shù)代碼。上述三步可以簡單概括為布置界面、設(shè)置屬性、編寫事件委托函數(shù)。【例5-3】兩個Form的窗體程序小案例。①第一步啟動C#應(yīng)用程序,新建一個項目,進入編輯環(huán)境,這樣系統(tǒng)會自動給我們新建一個窗體Fom1,如圖5-12所示。②從“項目”菜單中選擇“添加Windows窗體”項,打開添加新項界面,選擇“Windows窗體”。在名稱欄內(nèi),默認的名稱是Form2,可以根據(jù)需要來修改它的名稱。修改好后單擊“添加”按鈕,這樣設(shè)計窗口內(nèi)就有了第2個窗體,如圖5-13所示。③選中Form2窗體,從左邊的“工具箱”中拖曳控件,并為所拖曳的控件設(shè)置屬性,編寫相關(guān)的事件代碼。如拖曳一個Button控件,默認為“button1”,在右邊的“屬性”面板中,將button1的“Text”屬性改為“顯示窗體Form2”。然后,雙擊“button1”,切換到代碼頁,系統(tǒng)自動生成如下語句。privatevoidbutton1_Click(objectsender,EventArgse){
}編寫button1的Click事件代碼如下。privatevoidbutton1_Click(objectsender,EventArgse){Form2myForm=newForm2();myForm.Show();}這樣就可以了。當程序運行后,首先出現(xiàn)的是Form1窗口,其上有一個按鈕,單擊該按鈕后,出現(xiàn)了Form2窗口,如圖5-14所示。5.3.4演練
1.實驗題目Form類。2.實驗?zāi)康摹?掌握利用Form對象的基本屬性控制Form的外觀。● 了解利用Form對象的基本方法。3.實驗內(nèi)容(1)建立一個Windows應(yīng)用程序項目,包含F(xiàn)orm1和Form2兩個窗體。Form1中有一個按鈕“顯示Form2”,要求單擊該按鈕時才顯示Form2;Form2上也有一個按鈕“關(guān)閉Form1”,單擊這個按鈕,將關(guān)閉Form1,也就關(guān)閉了整個應(yīng)用程序。(2)選做:在(1)基礎(chǔ)上,當單擊Form1的標題欄的關(guān)閉按鈕時,顯示Form2,隱藏Form1。4.實驗步驟由讀者寫出。5.實驗總結(jié)由讀者寫出。5.3.5自測
1.選擇題(1)如果將窗體的FormBorderStyle屬性設(shè)置為None,則
。a.窗體沒有邊框并不可調(diào)整大小。b.窗體沒有邊框但可以調(diào)整大小。c.窗體有邊框但不可調(diào)整大小。d.窗體是透明的。(2)如果將窗體設(shè)置為透明的,則
。a.要將窗體的FormBorderStyle屬性設(shè)置為None。b.要將Locked屬性設(shè)置為True。c.要將Opacity屬性設(shè)置小于100%。d.要將Enable屬性設(shè)置為True。(3)下面描述錯誤的是
。a.窗體也是控件。b.窗體也是類。c.控件是從窗體繼承來的。d.窗體的父類是控件類。(4)要使窗體剛運行時,顯示在屏幕的中央,應(yīng)設(shè)置窗體的
屬性。a.WindowsStateb.StartPostionc.CenterScreend.CenterParenr基本知識3:基本控件
VisualStudio.NET提供了很多Windows窗體控件,而且每個控件都有大量的屬性和事件。這些控件及其屬性和事件使得我們可以快速地設(shè)計出內(nèi)容豐富的Windows窗體。本節(jié)將介紹幾個最基本的控件。5.4.1Label類控件
標簽(Label)控件是一種最簡單的控件,通常用于需要靜態(tài)文字提示的場合,是最常用的控件之一。Label控件還可用于顯示應(yīng)用程序運行時的信息,也可用于為窗體添加描述性文字,以便為用戶提供幫助信息。在應(yīng)用Label控件前,我們先來了解一下Label控件的幾個主要屬性。1.控件外觀● Text屬性。Label控件所顯示的提示性文字保存在Text屬性中。它的設(shè)置方法為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個Label控件放在一個窗體中,選中所生成的Label1,再在其屬性面板中把Text屬性改為所要顯示的文本即可,如圖5-15所示。運行效果如圖5-16所示。注意:TextAlign屬性只有在Label控件的AutoSize屬性值為False時有效● TextAlign屬性。為了設(shè)置Label控件中文字的排列方式,Label控件還定義了一個TextAlign屬性。該屬性同樣采用了可視化設(shè)置,如圖5-17所示,用戶可以很方便地設(shè)置Label控件中文字的排列方式?!?Image屬性。為了美化Label控件的顯示效果,還可以通過Image屬性為Label控件指定一幅圖片在為背景??梢宰鳛長abel控件背景的圖片類型包括jpg、bmp、gif、png等,操作如圖5-18所示。說明:VS2008提供的一些常用的圖標圖片存放的默認安裝位置為“C:\ProgramFiles\MicrosoftVisualStudio9.0\Common7\VS2008ImageLibrary”路徑下● ForeColor和BackColor屬性。分別表示文字顏色(前景色)和背景色,屬性類型都為Color結(jié)構(gòu)類型,可以進行可視化設(shè)置。通過Label控件的BackColor屬性可以設(shè)置標簽的背景顏色。在屬性面板中,系統(tǒng)提供了幾十種顏色可供選擇。另外還可以通過程序代碼來修改BackColor屬性,例如:Label1.BackColor=Color.Transparent;是將標簽設(shè)為透明?!?Font屬性。表示文本的字體,包含豐富的字體設(shè)置,屬性類型是System.Drawing.Font類,可以通過可視化的方法進行設(shè)置,如圖5-19所示。單擊Font屬性后面的“省略號”,即可彈出字體對話框,如圖5-20所示。2.控件布局屬性
● AutoSize屬性。表示控件大小是否自動適應(yīng)文字內(nèi)容,為bool類型,屬性值默認為True?!?Left、Top、Width、Height屬性和Location、Size屬性。表示控件在父容器中的定位和尺寸,其中Left、Top表示定位,在屬性面板中顯示為Location屬性,Width和Height表示尺寸,在屬性面板中顯示為Size屬性。Left、Top、Width、Height屬性是int類型,Location是Point結(jié)構(gòu)類型,Size是Size結(jié)構(gòu)類型。3.其他
● Enabled屬性。表示該控件是否可供用戶使用,為bool類型,默認為True(所有控件都有此屬性)。若設(shè)置此屬性值為False,則該控件在運行時狀態(tài)為灰色顯示(即為不可用)。5.4.2TextBox類控件
文本框(TextBox)用于獲取用戶輸入或顯示的文本,是最常用的控件之一。在應(yīng)用該控件前,我們先介紹一些他的常用屬性和方法事件。1.常用屬性
● Text屬性。保存用戶通過文本框輸入的信息,可以在界面設(shè)計時指定一個初始值,這樣在程序運行時,該初始值將自動顯示在該文本框中。在程序中可以通過讀取該屬性的值來獲取用戶的輸入信息。● ReadOnly屬性。指定文本框是否為只讀控件,默認值為False。默認情況下,文本框中的內(nèi)容可以被編輯。如果將ReadOnly屬性的值設(shè)為True后,則該控件不可用。● MultiLine屬性。控制編輯控件的文本是否能夠跨越多行,默認值為False。在默認的情況下,文本框可以最多輸入2
048個字符。如果將MultiLine屬性的值設(shè)為True,則最多可以容納32KB的文本。同樣,在多行輸入的情況下,也可以通過讀取該屬性的值來獲取用戶的輸入信息?!?TabIndex/TabStop屬性。按Tab鍵時的焦點順序,要想哪個TextBox獲得焦點,把它的TabStop屬性設(shè)為True即可。2.常用事件
【例5-4】文本框TextChanged事件的應(yīng)用演示。其大體步驟為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個TextBox控件放在一個窗體中,雙擊所生成的TextBox1,進入代碼編輯文件,輸入如下代碼。privatevoidtextBox1_TextChanged(objectsender,System.EventArgse){MessageBox.Show("文本已改變,請注意存盤!");}程序運行后,如果我們對文本框中的文本作任何改動,都會彈出一個對話框,如圖5-21所示。說明:上例是一個典型的選取事件不恰當?shù)姆蠢瑧?yīng)該用文本框的Leave事件完成此功能,請讀者通過此題進一步體會事件發(fā)生時機的含義。5.4.3Button類控件
按鈕(Button)控件允許用戶通過單擊來執(zhí)行操作。當該按鈕被單擊后,它看起來像是被按下然后釋放。它是最常用的控件之一。在應(yīng)用該控件前,我們先介紹一些它的常用屬性和方法事件。1.常用屬性
● Text屬性。Button控件所顯示的提示性的文字保存在Text屬性中。它的設(shè)置方法為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個Button控件放在一個窗體中,選中所生成的button1,再在其屬性面板中把Text屬性改為所要顯示的文本即可。● FlatStyle屬性。C#允許改變按鈕的外觀,一般設(shè)置FlatStyle屬性的不同值,就可以改變它的平面顯示風格,該屬性可以取如下的值?!?Flat:按鈕總是以平面方式顯示?!?Popup:鼠標移動到按鈕上時,以三維方式顯示按鈕,其他情況同F(xiàn)lat。● Standard:按鈕總是以三維方式顯示。2.常用事件
● Click事件。對于Button控件,我們常用的事件是Click事件,是單擊按鈕時所引發(fā)的處理操作。【例5-5】按鈕Click事件的應(yīng)用演示。下面我們通過一個小例子,來演示一下Click事件的應(yīng)用。其大體步驟為,首先從“工具箱”中的“所有Windows窗體”中拖曳一個Button控件放在一個窗體中,如圖5-22所示,
雙擊所生成的button1,進入代碼編輯區(qū)域,輸入如下代碼。privatevoidbutton1_Click(objectsender,System.EventArgse){MessageBox.Show("你單擊了一下按鈕哦!");}程序運行結(jié)果如圖5-23所示:3.其他事件
對于Button控件,我們還經(jīng)常用KeyDown、KeyPress、KeyUp事件來響應(yīng)鍵盤的一些操作,用MouseDown、MouseEnter、MouseHover、MouseLeave、MouseMove事件來響應(yīng)鼠標的一些操作。Button控件還有很多事件,有興趣的讀者可以自己試驗一下,看看有什么有趣的事件發(fā)生.注意:Form類還有AcceptButton和CancelButton兩個屬性與Button按鈕有關(guān),設(shè)置窗體的AcceptButton屬性值為某一個按鈕(例如Button1),相當于運行該窗體時用戶按Enter鍵時所單擊的窗體上的Button1按鈕;設(shè)置窗體的CancelButton屬性值為某一個按鈕(例如Button2),相當于運行該窗體時用戶按Esc鍵時所單擊的窗體上的Button2按鈕。5.4.4演練
1.實驗題目基本控件2.實驗?zāi)康摹?掌握利用Label、TextBox、Button類控件的基本屬性?!?了解利用Label、TextBox、Button的基本方法。3.實驗?zāi)康模?)設(shè)計一個窗體,包含一個Label,一個TextBox,一個Button。Label對象顯示“請輸入文本”,TextBox對象可以接受多行輸入,Button對象的顯示文本是“保存”。若文本框中文本改變過而未按保存按鈕,當窗體關(guān)閉時,顯示消息框“您還未保存!”,且取消關(guān)閉操作;文本框文本未改變或已經(jīng)按過保存,則不提示,執(zhí)行關(guān)閉。(2)選做:設(shè)計書店管理系統(tǒng)登錄框,當輸入正確的用戶名密碼并單擊登錄時,用提示框提示登錄成功,當輸入錯誤的用戶名密碼時,提示登錄失敗。4.實驗步驟由讀者寫出。5.實驗總結(jié)由讀者寫出。5.4.5自測1.填空題(1)表示控件是否可以對用戶交互做出響應(yīng)的屬性是
。(2)表示是否顯示控件的屬性是
。(3)按鈕控件的常用事件是
。(4)如果想在文本框中輸入密碼,常指定
屬性。2.選擇題(1)當TextBox控件文本(Text)屬性發(fā)生改變時會引發(fā)控件的
事件。a.TextChangedb.SizeChangedc.StyleChangedd.LocationChanged(2)設(shè)置TextBox控件只讀屬性應(yīng)設(shè)置
。a.Textb.ReadOnlyc.MultiLined.WordWrap(3)Label控件中設(shè)置中文字的排列方式的屬性
。a.Textb.TextAlignc.Sized.Tag(4)要使TextBox控件中的輸入顯示一系列的“*”,應(yīng)設(shè)置該控件的
屬性。a.Nameb.Textc.PasswordChard.ReadOnly基本知識4:菜單相關(guān)控件
菜單條、狀態(tài)條和工具條是Windows窗體程序中用戶界面的一個重要部分,是應(yīng)用非常普遍的桌面元素。在.NETFramework3.5中,菜單條、狀態(tài)條、工具條都由新增的ToolStrip控件提供高度一致和高度靈活的處理。5.5.1ToolStrip控件ToolStrip控件為Windows工具欄對象提供支持。它是多種工具條項(工具條子控件)的容器。1.ToolStrip控件的主要屬性● Name屬性。獲取或設(shè)置控件的名稱?!?Items屬性。獲取菜單條中的工具條項的集合。說明:Items是集合屬性,有Add、Remove等集合屬性具有的方法;Items屬性類型為ToolStripItemCollection類型,其中每個元素是ToolStripItem類型,而ToolStripItem僅僅是一個個ToolStripButton、ToolStripTextBox、ToolStripLabel等的基類型;即,實際包含在ToolStrip的Items屬性中的元素是ToolStripButton、ToolStripTextBox、ToolStripLabel等子控件;這些子控件都是窗體類的字段,可以用this.toolStripLabel1來直接訪問,而不用this.toolStrip1.Items[0]的方式來訪問?!?ShowItemToolTips屬性。獲取或設(shè)置一個值,該值指示是否顯示MenuStrip的工具提示。【例5-6】演示工具欄ToolStrip控件的應(yīng)用。①啟動VS2008,建立一個項目,進入窗體設(shè)計的主界面。②從左邊的“工具箱”中拖曳一個ToolStrip控件,默認為“toolStrip1”,單擊智能按鈕,選擇“Button”選項,如圖5-24所示,然后在其“屬性”面板中,單擊“Image”屬性后的“…”按鈕,打開“選擇資源”對話框,如圖5-25所示,單擊“導(dǎo)入”按鈕,導(dǎo)入相應(yīng)的圖片資源后單擊“確定
圖5?24ToolStrip控件的智能按鈕圖5?25選擇資源對話框③重復(fù)步驟②,添加“保存”、“剪切”、“粘貼”和分隔欄,如圖5-26所示。在添加分隔欄時,選擇的是智能按鈕中的“Separator”項。④雙擊“打開”按鈕,切換到代碼頁,系統(tǒng)自動生成如下語句。privatevoidtoolStripButton1_Click(objectsender,EventArgse){}編寫“打開”按鈕的Click事件代碼如下。privatevoidtoolStripButton1_Click(objectsender,EventArgse){//此處添加相應(yīng)代碼}重復(fù)本步驟,添加“保存”、“剪切”、“粘貼”項的代碼。⑤按F5鍵(或用菜單操作“調(diào)試|啟動”),進行調(diào)試,調(diào)試成功的效果如圖5-27所示。
圖5?26添加工具欄圖片按鈕
圖5?27工具欄的運行效果5.5.2
MenuStrip控件
MenuStrip控件表示窗體菜單結(jié)構(gòu)的容器。此控件容納ToolStripMenuItem、ToolStripComboBox、ToolStripSeparator和ToolStripTextBox對象。MenuStrip控件主要用來容納ToolStripMenuItem控件,該控件表示一個菜單項。ToolStripSeparaor只是一個占位間隔。用戶可以將ToolStripMenuItem對象添加到MenuStrip中。每個ToolStripMenuItem也可以是其他子菜單項的父菜單。MenuStrip控件的屬性和ToolStrip類似,其功能主要是由ToolStripMenuItem控件實現(xiàn)的。1.ToolStripMenuItem控件的主要屬性● Name屬性。獲取或設(shè)置控件的名稱。● Text。獲取或設(shè)置菜單項的顯示文本?!?ShortcutKeys。獲取或設(shè)置與ToolStripMenuItem關(guān)聯(lián)的快捷鍵2.ToolStripMenuItem控件的主要事件● Click事件。在單擊ToolStripItem時發(fā)生?!纠?-7】菜單條及菜單項的應(yīng)用。①啟動VS2008,建立一個項目,進入窗體設(shè)計的主界面。②從左邊的“工具箱”中拖曳一個MenuStrip控件,默認為“menuStrip1”,單擊智能按鈕,選擇“MenuItem”選項,如圖5-28所示,然后在右邊的“屬性”面板中,將“Text”屬性改為“文件”(或者選擇“MenuItem”選項后單擊該項直接輸入文本也可以修改其“Text”屬性值)。③重復(fù)步驟②,添加“打開”、“保存”和分隔欄,如圖5-29所示。在添加分隔欄時,選擇的是智能按鈕中的“Separator”項。
圖5?28MenuStrip控件的智能按鈕
圖5?29添加子菜單
④雙擊“打開”菜單項,切換到代碼頁,系統(tǒng)自動生成如下語句。privatevoid打開ToolStripMenuItem_Click(objectsender,EventArgse){}編寫“打開”菜單項的Click事件代碼如下。privatevoid打開ToolStripMenuItem_Click(objectsender,EventArgse){MessageBox.Show("您單擊的是打開項!");}重復(fù)本步驟,添加保存項的代碼。⑤按F5鍵(或用菜單操作“調(diào)試|啟動”),進行調(diào)試,調(diào)試成功的效果如圖5-30所示。⑥單擊“打開”項后,會彈出一個消息框,如圖31所示。圖5?30菜單運行顯示
圖5?31消息框
5.5.3ContextMenuStrip控件
在Windows操作系統(tǒng)、Office辦公軟件等這類軟件中,用戶在某個界面元素上單擊鼠標右鍵,都可以彈出一個快捷菜單,幫助用戶實現(xiàn)一些功能的快捷操作。在開發(fā)Windows應(yīng)用程序時實現(xiàn)這一功能,將大大方便用戶。那么如何來實現(xiàn)這一功能呢?在.NET中,利用ContextMenuStrip控件即可完成此功能。ContextMenuStrip控件的主要屬性和MenuStrip控件相同,容納的工具條項也相同,它們在使用上的不同之處主要是:ContextMenuStrip需要與某個界面元素建立關(guān)聯(lián),即需要設(shè)置某個宿主控件的ContextMenuStrip屬性為一個ContextMenuStrip控件的實例?!纠?-8】上下文菜單條ContextMenuStrip的使用。
圖5?32ContextMenuStrip控件的智能按鈕下面我們通過一個小例子來演示一下快捷菜單的應(yīng)用。①啟動VS2008,建立一個項目,進入窗體設(shè)計的主界面。②從左邊的“工具箱”中拖曳一個ContextMenuStrip控件,默認為“contextMenuStrip1”,單擊智能按鈕,選擇“MenuItem”選項,如圖5-32所示,然后在右邊的“屬性”面板中,將“Text”屬性改為“最大化”。③重復(fù)步驟②,添加“最小化”、“關(guān)閉”和分隔欄,如圖5-33所示。在添加分隔欄時,選擇的是智能按鈕中的“Separator”項。圖5?32ContextMenuStrip控件的智能按鈕④雙擊“最大化”菜單項,切換到代碼頁,系統(tǒng)自動生成如下語句。privatevoid最大化ToolStripMenuItem_Click(objectsender,EventArgse){}編寫“最大化”菜單項的Click事件代碼。privatevoid最大化ToolStripMenuItem_Click(objectsender,EventArgse){WindowState=FormWindowState.Maximized;}重復(fù)本步驟,添加最小化項和關(guān)閉項的代碼。privatevoid最小化ToolStripMenuItem_Click(objectsender,EventArgse){WindowState=FormWindowState.Minimized;}privatevoid關(guān)閉ToolStripMenuItem_Click(objectsender,EventArgse){this.Close();}⑤設(shè)置Form1的ContextMenuStrip屬性為contextMenuStrip1。⑥按F5鍵(或用菜單操作“調(diào)試|啟動”),進行調(diào)試,調(diào)試成功的效果如圖5-34所示。
圖5?33添加快捷菜單圖5?34彈出式快捷菜單演示5.5.4StatusStrip控件
StatusStrip控件可以顯示正在Form上查看的對象的相關(guān)信息、對象的組件或與該對象在應(yīng)用程序中的操作相關(guān)的上下文信息。通常,StatusStrip控件由StatusLabel對象組成,每個這樣的對象都可以顯示文本、圖標或同時顯示這二者。StatusStrip還可以包含DropDownButton、SplitButton和ProgressBar控件。StatusStrip控件的屬性和ToolStrip類似,其功能主要是由StatusLabel控件實現(xiàn)的。StatusLabel控件的主要屬性如下?!?Name。獲取或設(shè)置項的名稱。● Text。獲取或設(shè)置要顯示在項上的文本?!?Spring。獲取或設(shè)置一個值,該值指示在調(diào)整窗體大小時,StatusLabel是否自動填充StatusStrip上的可用空間。StatusStrip控件的使用,跟前面所述的MenuStrip控件、ContextMenuStrip控件、ToolStrip控件類似,這里就不一一贅述,請讀者參照上述控件自己學(xué)習(xí)。5.5.5演練
1.實驗題目工具條等控件2.實驗?zāi)康摹?掌握ToolStrip、MenuStrip、ContextMenuStrip、StatusStrip控件的基本屬性?!?掌握ToolStripLabel、ToolStripButton的常用屬性和事件。3.實驗內(nèi)容設(shè)計一個窗體,包含兩個文本框、一個ToolStrip、一個MenuStrip、一個ContextMenuStrip、一個StatusStrip,ToolStrip中包含一個ToolStripButton,MenuStrip和ContextStrip中各包含一個菜單項,菜單項和按鈕都完成一個功能:用戶單擊時在StatusStrip中顯示被單擊的控件的名稱。4.實驗步驟由讀者寫出。5.實驗總結(jié)由讀者寫出。5.6基本知識5:其他常用控件
除了上述基本控件、菜單控件以外,.NET還提供了很多其他Windows窗體控件,而且每個控件都有大量的屬性和事件。本節(jié)將再介紹幾個比較常用的控件。5.6.1RadioButton類、CheckBox類控件、GroupBox類控件1.RadioButton控件RadioButton控件通常成組出現(xiàn),用于為用戶提供由兩個或多個互斥選項組成的選項集。當用戶選擇單選按鈕時,同一組中的其他單選按鈕不能同時被選中。即在這組選項中,你能且只能選擇一個。(1)RadioButton控件主要是Checked屬性?!?Checked屬性。表示單選按鈕是否被選中,默認值為False,默認情況下接受單擊會自動被選中,同一容器的其他RadioButton對象的Checked屬性的值也會隨之改變。在同一Form窗體上,可以用若干GroupBox控件容納RadioButton,以實現(xiàn)對RadioButton分組,如圖5-35所示。(2)RadioButton控件的常用事件?!?CheckedChanged事件。當RadioButton控件的Checked屬性值改變時發(fā)生。下面利用RadioButton控件及前幾節(jié)介紹的Label及Button控件,設(shè)計一個類似查詢分析器登錄框的示例。新建一個項目,本示例的具體操作步驟如下。第1步(布置界面),選中Form1窗體,從工具箱中拖曳一個GroupBox,然后再在GroupBox控件中拖曳兩個RadioButton、兩個Label標簽、兩個TextBox文本框,在Form窗體中再拖曳三個Button按鈕。第2步(設(shè)置屬性),如圖5-36所示,修改各控件的Name屬性和Text屬性,此外還要設(shè)置Text屬性值為“Windows身份驗證”的RadioButton的Checked屬性值為True,兩個Label和兩個TextBox的Enabled屬性值為False。第3步(編寫事件委托函數(shù)),雙擊Text屬性值為“SQLServer身份驗證”的RadioButton,進入代碼文件,編寫其發(fā)生CheckedChanged事件時調(diào)用的委托函數(shù),具體代碼如下。
圖5?35單選按鈕的運行效果圖5?36界面的布置效果privatevoidradioButtonSqlServer_CheckedChanged(objectsender,EventArgse){if(radioButtonSqlServer.Checked){labelName.Enabled=true;labelPwd.Enabled=true;textBoxName.Enabled=true;textBoxPwd.Enabled=true;}else{labelName.Enabled=false;labelPwd.Enabled=false;textBoxName.Enabled=false;textBoxPwd.Enabled=false;}}按F5運行程序,開始時,兩個Label和兩個TextBox都是灰顯(不可用)狀態(tài)。當選中“SQLServer身份驗證”的RadioButton按鈕時,它們都變?yōu)榭捎?;當選中“Windows身份驗證”的RadioButton按鈕時,它們又都變?yōu)椴豢捎谩?.CheckBox類控件
CheckBox類控件(復(fù)選框)常用于為用戶提供多項選擇。在同一窗體中,不同的復(fù)選框是相互獨立的,復(fù)選框之間互不影響,這和前面的RadioButton單選按鈕是明顯不同的。可以成組地使用復(fù)選框以顯示多重選項,使用戶可以從中選擇一項或多項。圖5?37CheckAlign屬性的可視化設(shè)置對于CheckBox控件,經(jīng)常使用的屬性如下● Checked屬性。表示復(fù)選框是否被選中,默認值為False。當復(fù)選框被選中時,其Checked屬性被設(shè)置為True,當Checked屬性值更改時,將引發(fā)CheckedChanged事件。圖5?37CheckAlign屬性的可視化設(shè)置●
CheckAlign屬性。用來確定控件中小方框相對于文本的位置。對于這個屬性,系統(tǒng)采用了可視化設(shè)置,如圖5-37用戶可以方便地進行設(shè)置。對于CheckBox控件,經(jīng)常使用的事件為CheckedChanged事件,這跟RadioButton控件相同。3.GroupBox類控件GroupBox控件稱為成組框,它的作用是將一些控件捆綁成一個組,使用戶界面清晰明了。值得注意的是,當RadioButton控件分組使用時,一定要將每組分別放在一個GroupBox控件內(nèi),才能起到分組單選的作用。設(shè)計該控件時,要將GroupBox控件拖入Windows窗體內(nèi),然后再向框內(nèi)加入其他控件。GroupBox控件一般只修改其Text屬性,Text是框頭的提示性文字。很少為GroupBox控件編寫事件處理程序。5.6.2ListBox類、ComboBox類控件
1.ListBox控件ListBox控件可以顯示一組選項的列表,用戶可以單擊選擇這些項。ListBox類還提供了一些方法,用以添加、刪除項,以及在列表的項內(nèi)查找文本。(1)主要屬性。● Items屬性。列表項,集合中的元素是object類型,一般是string?!?SelectedIndex屬性。獲取或設(shè)置ListBox中當前選定項的從零開始的索引?!?SelectedItem屬性。獲取或設(shè)置ListBox中的當前選定項。● SelectedItems/SelectedIndices屬性。分別是多項選中的選中項集合和選中索引集合,屬性類型分別為SelectedObjectCollection和SelectedIndexCollection類型。● SelectionMode屬性。獲取或設(shè)置在ListBox中選擇項所用的方式,SelectionMode屬性值為枚舉類型:None、One、MultiSimple(單擊即選中,再單擊即取消選中),MultiExtend。(2)主要事件?!?SelectedIndexChanged事件。該事件當SelectedIndex屬性值更改時發(fā)生。關(guān)于ListBox控件的使用,可以采用可視化的設(shè)計方法,也可以采用編寫代碼的方法來設(shè)計。下面通過一個例題程序來演示ListBox控件的使用?!纠?-9】設(shè)計一個窗體,實現(xiàn)單擊Text屬性值為“〉〉”的按鈕可以將一個列表框(稱為源列表框)中的選中項加入到另一個列表框(稱為目標列表框),并且單擊Text屬性值為“〈〈”的按鈕可以將目標列表框中的選中項刪除的功能。各控件功能如表5-2所示。表5?2 各控件的功能表類型NameTextItemsClick事件功能ListBox源ListBox經(jīng)典著作社會科學(xué)歷史地理政治法律外國文學(xué)ListBox目標ListBoxButton添加Button>>將“源ListBox”的選中項添加到“目標ListBox”中Button去掉Button<<將“目標ListBox”的選中項刪除圖5?38窗體布置效果本示例的具體操作步驟如下。①第1步(布置界面),按照上述表格,在Form窗體上拖曳兩個ListBox和兩個Button按鈕,界面設(shè)計效果如圖5-38所示。②第2步(設(shè)置屬性),按照上述表格描述,分別設(shè)置各控件的對應(yīng)屬性值。③第3步(編寫事件委托函數(shù)),分別雙擊兩個Button按鈕,進入代碼文件,編寫兩個Button按鈕被單擊發(fā)生Click事件時調(diào)用的委托函數(shù),具體函數(shù)代碼如下。privatevoid添加Button_Click(objectsender,EventArgse){
目標ListBox.Items.Add(源ListBox.SelectedItem);}privatevoid去掉Button_Click(objectsender,EventArgse){
目標ListBox.Items.Remove(目標ListBox.SelectedItem);}圖5?38窗體布置效果④按F5運行程序,當選中源ListBox中的“經(jīng)典著作”項,單擊“>>”按鈕,將其添加到目標ListBox中去,同樣操作把“社會科學(xué)”和“政治法律”選項也添加到目標ListBox中,操作效果如圖5-39所示。
⑤當選中目標ListBox中的“社會科學(xué)”項后,單擊“<<”按鈕,把該選中項刪除,操作效果如圖5-40所示。
圖5?39窗體運行效果
圖5?40單擊“<<”按鈕的效果2.ComboBox類控件ComboBox控件通常稱為組合框,可以看作是把一個TextBox控件和一個ListBox控件組合在一起的控件。因此它具有上述兩種控件的特點:用戶既可以在ComboBox控件中進行輸入,就像在TextBox控件中一樣,也可以在其附帶的下拉列表框中選取某項內(nèi)容。通常ComboBox控件的下拉列表部分折疊顯示。ComboBox控件的屬性大部分都來自于文本框和列表框,用法上基本也沒什么區(qū)別。下面就介紹ComboBox控件的一個常用屬性?!?DropDownStyle。獲取或設(shè)置指定組合框樣式的值。該屬性可取的值為下列值之一。● DropDown:文本部分可編輯,用戶必須單擊箭頭按鈕來顯示列表部分?!?DropDownList:用戶不能直接編輯文本部分,必須單擊箭頭按鈕來顯示列表部分。● Simple:文本部分可編輯,列表部分總可見。ComboBox控件的方法和事件也大部分來自文本框和列表框,這里就不再贅述,請讀者自學(xué)練習(xí)使用。5.6.3OpenFileDialog類控件
“打開”對話框主要用于已經(jīng)存在的文件,如圖5-41所示,其作用一般僅僅為獲取用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度研究生助學(xué)金貸款擔保服務(wù)合同
- 2025年度腳手架租賃及施工安全防護合同
- 2025年度建筑工程質(zhì)量檢測與驗收合同范本
- 2025年度二零二五智能住宅包工不包料施工合同樣本
- 2025年度國際貨物運輸代理服務(wù)合同規(guī)范范本
- 2025年度辦公家具定制設(shè)計與全球銷售合同
- 2025年加油站廢棄物處理合同
- 2025年度數(shù)據(jù)中心機房裝修工程安全協(xié)議合同
- 2025年度年會場地租賃合同(含攝影攝像服務(wù))
- 2025年婚外情婚姻解除后的子女撫養(yǎng)及生活費支付合同
- 天津市部分區(qū)2023-2024學(xué)年高二上學(xué)期期末考試 生物 含解析
- 變壓器投標書-技術(shù)部分
- 《我國跨境電子商務(wù)消費者權(quán)益保護問題研究》
- 2024九省聯(lián)考適應(yīng)性考試【甘肅省】歷史試卷及答案解析
- 四年級語文下冊第六單元【集體備課】(教材解讀+教學(xué)設(shè)計)
- 小學(xué)一年級數(shù)學(xué)思維訓(xùn)練100題(附答案)
- 蘇教版小學(xué)信息技術(shù)五年級下冊五年級下冊教案全集
- 蘇教版八年級數(shù)學(xué)上冊期末試卷及答案【完美版】
- 法院拍賣議價協(xié)議書
- 新能源充電站運營手冊
- 2021年人教版八年級物理上冊期末考試卷(完美版)
評論
0/150
提交評論