![《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第1頁](http://file4.renrendoc.com/view12/M08/21/38/wKhkGWZJmZGAWnMcAAClP5xVSDQ813.jpg)
![《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第2頁](http://file4.renrendoc.com/view12/M08/21/38/wKhkGWZJmZGAWnMcAAClP5xVSDQ8132.jpg)
![《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第3頁](http://file4.renrendoc.com/view12/M08/21/38/wKhkGWZJmZGAWnMcAAClP5xVSDQ8133.jpg)
![《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第4頁](http://file4.renrendoc.com/view12/M08/21/38/wKhkGWZJmZGAWnMcAAClP5xVSDQ8134.jpg)
![《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第5頁](http://file4.renrendoc.com/view12/M08/21/38/wKhkGWZJmZGAWnMcAAClP5xVSDQ8135.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章文本文件操作7.1文件讀取7.2音像店管理4.07.3文件寫入7.4我的便簽
7.1文件讀取
7.1.1文件與流在對文件進(jìn)行操作的時(shí)候,不管什么類型的文件,首先必須以流的形式將其讀取到內(nèi)存中,然后才能夠使用相應(yīng)的對象來完成各種操作。在C#中,我們常用FileStream類來完成這個(gè)工作。FileStream類支持對文件系統(tǒng)上的文件進(jìn)行讀取、寫入、打開和關(guān)閉等操作,它既支持同步操作,也支持異步操作,其語法結(jié)構(gòu)如下:FileStream文件對象操作對象=newFileStream(stringpath,FileModemode[,FileAccessaccess,FileShareshare])參數(shù)說明:path:string類型必選參數(shù),需要操作的文件路徑。mode:FileMode類型必選參數(shù),打開文件的方式,其只有固定的幾個(gè)取值,表7-1列出了可取值及其作用。access:FileAccess類型可選參數(shù),用于設(shè)置文件訪問方式,它只有固定的幾個(gè)取值,表7-2列出了可取值及其作用。share:FileShare類型可選參數(shù),用于設(shè)置文件共享方式,它只有固定的幾個(gè)取值,表7-3列出了可取值及其作用。通過幾個(gè)參數(shù)的設(shè)置,我們就可以輕松地將一個(gè)文件讀取到內(nèi)存中:FileStreamfs=newFileStream("c:\\1.txt",FileMode.Append,FileAccess.ReadWrite, FileShare.None);7.1.2文件讀取盡管FilmStream對象自己帶有相關(guān)的讀取方法,但是其讀出的一般都是字節(jié)數(shù)組,不利于我們后續(xù)的操作,所以在進(jìn)行文本文件的讀取操作時(shí)我們一般采用StreamReader類來完成,因?yàn)樗僮髌饋砀雍唵?。StreamReader對象是一個(gè)建立在文件流基礎(chǔ)之上的數(shù)據(jù)操作對象,它可以以一種特定的編碼從字節(jié)流中讀取字符,一般情況下我們可以使用它讀取標(biāo)準(zhǔn)文本文件的各行信息。在創(chuàng)建StreamReader對象時(shí)我們需要一個(gè)FilmStream對象來幫忙:StreamReadersr=newStreamReader(fs);在創(chuàng)建了StreamReader對象之后我們就可以通過其提供的方法來讀取文件中的數(shù)據(jù)了,常用的讀取方法有兩個(gè):ReadLine()和ReadToEnd()。ReadLine()方法的作用是從文件中讀取一行數(shù)據(jù),在使用這個(gè)方法的時(shí)候一般都需要一個(gè)循環(huán)結(jié)構(gòu)來讀取整個(gè)文件的內(nèi)容:stringstr=null;while((str=sr.ReadLine())!=null){lblDesc.Text+=str;}在上面的代碼中需要我們注意的是循環(huán)的條件,這樣做既可以取值又可以作為循環(huán)判斷的條件。這種方式適合讀取比較大的文件,如果讀取小文件則可以使用ReadToEnd():lblDesc.Text=sr.ReadToEnd();盡管操作過程很簡單,但是在實(shí)際使用過程中,我們發(fā)現(xiàn)經(jīng)常讀取出來的是亂碼,問題就出在了編碼格式上。默認(rèn)情況下,StreamReader對象采用的是UTF-8的編碼格式,而文本文件的默認(rèn)編碼格式則是ANSI。解決的方法就是在創(chuàng)建StreamReader對象時(shí)設(shè)置一下編碼格式:StreamReadersr=newStreamReader(fs,Encoding.Default);Encoding類在這里的作用就是幫助我們以指定的編碼格式來讀取文件,它可以支持多種不同的編碼格式,通過靜態(tài)屬性可以很方便地設(shè)置讀取格式,表7-4列出了常用的幾個(gè)屬性。當(dāng)所有的操作都結(jié)束之后,一定不要忘記關(guān)閉文件流,否則這個(gè)文件就無法被其他程序訪問:sr.Close();fs.Close();盡管在大多數(shù)情況下,關(guān)閉FileStream流之后相應(yīng)的StreamReader對象也會被關(guān)閉,但是作為一個(gè)好的編程習(xí)慣,還是應(yīng)該在關(guān)閉流之前先將讀取對象關(guān)閉。另外一種常見的使用方式是直接通過StreamReader類來打開文件:StreamReadersr=newStreamReader("c:\\1.txt",Encoding.Default);事實(shí)上這兩種方式并沒有本質(zhì)上的區(qū)別,只不過在第二種方法中文件流變成了一個(gè)系統(tǒng)自動創(chuàng)建的隱式對象而已。
7.2音像店管理4.0
7.2.1問題在新版音像店管理程序中,文本文件將作為一種數(shù)據(jù)存儲的手段出現(xiàn)在程序中。當(dāng)?shù)昀镉辛诵碌碾娪盎蛘攥F(xiàn)在的電影信息發(fā)生變化之后,管理員可以很方便地修改文本文件中的內(nèi)容,這樣當(dāng)用戶通過程序查看某部電影的信息時(shí),系統(tǒng)就可以讀取這個(gè)文件,并且將數(shù)據(jù)呈現(xiàn)在用戶面前,其運(yùn)行效果如圖7-1所示。具體需求如下:(1)影片類型有戰(zhàn)爭片、科幻片、愛情片、魔幻片和動漫等,可以設(shè)定為固定的。(2)選擇不同類型的影片后,需要在下面的ListBox中將該類型下的所有電影的名稱顯示出來。(3)雙擊一部電影的名稱,在窗體右側(cè)顯示電影的詳細(xì)信息。(4)每一部電影包含兩個(gè)文件:電影封面和電影信息文件。(5)查看的電影超過一部的時(shí)候用選項(xiàng)卡的方式呈現(xiàn)。7.2.2需求分析1.選項(xiàng)卡整個(gè)程序最顯眼的可能就是占了界面大部分的選項(xiàng)卡了,實(shí)現(xiàn)這個(gè)效果所采用的控件叫TabControl,這是WinForm眾多容器類控件中的一個(gè),不過和前面我們接觸過的容器控件不同,TabControl控件本身并不能夠直接作為其他控件的容器來使用,它是通過TabPage選項(xiàng)卡頁控件來工作的,因此在使用TabControl時(shí)最重要的就是其TabPages屬性,該屬性用來設(shè)置和管理所有的選項(xiàng)卡頁。和ComboBox控件的Items屬性相似,TabControl控件的TabPages屬性也有自己獨(dú)立的選項(xiàng)卡頁編輯器。點(diǎn)擊“添加(A)”按鈕就可以添加一個(gè)新的選項(xiàng)卡頁,每一個(gè)選項(xiàng)卡頁都可以設(shè)置其獨(dú)立的屬性,其中最重要的是Name和Text。Name用來設(shè)置選項(xiàng)卡頁對象的名稱,以tap作為前綴;Text用來設(shè)置選項(xiàng)卡頁的標(biāo)題。除了使用編輯器設(shè)置選項(xiàng)卡頁之外,也可以通過代碼的方式來完成這個(gè)工作:TabPagetp=newTabPage();tp.Name="tapFilm";tp.Text="超級戰(zhàn)艦";tabControl1.TabPages.Add(tp);當(dāng)然無論采用哪種方式,添加的都只是一個(gè)空的選項(xiàng)卡頁,如果需要在其上呈現(xiàn)其他控件則還需要更多的操作。同樣的,我們也有很多方式來設(shè)計(jì)選項(xiàng)卡頁的內(nèi)容。如果采用的是編輯器,則可以直接在VS2010中設(shè)計(jì)界面。如果期望動態(tài)地生成界面,則可以通過代碼的方式來實(shí)現(xiàn)://創(chuàng)建新的選項(xiàng)卡頁TabPagetp=newTabPage();tp.Name="tapFilm";tp.Text="超級戰(zhàn)艦";//動態(tài)添加控件LabellblName=newLabel();lblName.Name="lblName";lblName.Text="姓名:";tp.Controls.Add(lblName);tabShowInfo.TabPages.Add(tp);這種方式可以根據(jù)需要動態(tài)地生成界面,但是麻煩之處在于需要精確地設(shè)定每一個(gè)控件的位置和大小。另外一種方式就是將整個(gè)窗體嵌入到選項(xiàng)卡頁中://創(chuàng)建新窗體和新選項(xiàng)卡frmFilmDetailsfd=newfrmFilmDetails(fileName);TabPagetp=newTabPage();//設(shè)置窗體屬性fd.TopLevel=false;fd.Parent=tp;fd.Dock=DockStyle.Fill;//添加選項(xiàng)卡tp.Controls.Add(fd);tabShowInfo.TabPages.Add(tp);fd.Show();//刷新和設(shè)定選項(xiàng)卡tabShowInfo.Refresh();tabShowInfo.SelectedTab=tp;在上面的代碼中,我們首先創(chuàng)建了一個(gè)窗體對象和一個(gè)選項(xiàng)卡頁對象。接下來我們對窗體的幾個(gè)屬性進(jìn)行設(shè)置:TopLevel屬性告訴系統(tǒng)我們聲明的窗體對象不是一個(gè)頂級窗體,這樣才能夠?qū)⑵淝度氲狡渌娜萜骺丶?;Parent屬性用來設(shè)置窗體對象的父容器,自然這里的父容器就是選項(xiàng)卡頁對象了;Dock屬性用來設(shè)置窗體的??糠绞剑覀冊谶@里選擇了Fill,也就是填充滿父容器。第三步,我們將窗體對象添加到選項(xiàng)卡頁中,并且將選項(xiàng)卡頁對象添加到TabControl中,然后通過Show()方法打開窗體,這樣就完成了窗體的嵌入工作。最后,我們將整個(gè)選項(xiàng)卡控件刷新,并設(shè)定新添加的選項(xiàng)卡頁對象為當(dāng)前選中的選2.控件聯(lián)動在我們這一版本的管理程序中,需要實(shí)現(xiàn)電影類型、電影名稱和電影詳細(xì)內(nèi)容之間的聯(lián)動效果,這需要ComboBox、ListBox和TabControl三個(gè)控件的緊密配合。聯(lián)動的基本實(shí)現(xiàn)思路很簡單:在ComboBox控件中選擇某個(gè)電影類型后,在其SelectedIndexChanged事件中向ListBox控件中填充相應(yīng)的電影名稱,在雙擊ListBox中某個(gè)電影后,在其DoubleClick事件中完成在TabControl控件中顯示該電影詳細(xì)信息的工作。根據(jù)這個(gè)思路,我們需要為所有的電影設(shè)置類別這個(gè)屬性。另外,為了能夠顯示詳細(xì)信息,我們還需要為電影設(shè)置名稱、上映時(shí)間、主演和介紹等屬性。最好的做法是單獨(dú)創(chuàng)建一個(gè)電影類,將上面提到的內(nèi)容都定義成其屬性,但是這樣一來,我們就需要在窗體上聲明很多電影類對象或者創(chuàng)建一個(gè)電影類的數(shù)組。無論采用哪種方式我們的程序中都會產(chǎn)生很多對象,可是我們需要的僅僅是電影的名稱而已。因此,在這里我們采用另一種方式去實(shí)現(xiàn),雖然顯得很麻煩,但是卻能夠減少系統(tǒng)的開銷,而且讓程序變得更加靈活://生成文件名stringpath=Application.StartupPath+"\\Films\\"+(cboType.SelectedIndex+1).ToString()+".txt";StreamReadersr=newStreamReader(path,Encoding.Default);lstFilm.Items.Clear();//讀取文件strings=null;while((s=sr.ReadLine())!=null)lstFilm.Items.Add(s);看到這里大家應(yīng)該就明白了,我們并沒有將電影名稱放在程序中,而是通過文件讀取的方式從外部獲得,因此在程序的開始,我們通過ComboBox的SelectedIndex屬性來合成文件路徑,這里有以下幾個(gè)地方需要我們特別注意。首先是文件的命名,因?yàn)槲覀兪歉鶕?jù)控件的選擇項(xiàng)來完成操作的,所以我們設(shè)定ComboBox控件中每一項(xiàng)的下標(biāo)加一即為該類型電影的文件名稱。這樣我們只需要知道ComboBox控件和ListBox控件的選中項(xiàng)下標(biāo)就可以知道用戶所要查看的文件名稱了。第二個(gè)需要我們關(guān)注的是Application.StartupPath,其作用是取得當(dāng)前可執(zhí)行文件的路徑。在WinForm的文件操作中,如果打開文件的時(shí)候只給出文件名而不包含路徑,那么該文件必須放在和EXE文件同一路徑下或者放在System32目錄下,否則就必須給出文件的完整路徑。因此,在進(jìn)行文件操作時(shí)我們一般將文件放置在和EXE同一路徑或EXE所在目錄的子目錄下,這樣通過Application.StartupPath就可以取得EXE文件所在的目錄,然后經(jīng)過簡單的合成就可以獲得文件的完整路徑了。接下來要完成的就是雙擊ListBox中的某一項(xiàng)后打開該電影的詳細(xì)信息,這中間的大部分代碼我們在前面選項(xiàng)卡部分已經(jīng)介紹過了,因此這里只給出其中一部分:stringfileName=(cboType.SelectedIndex+1).ToString()+(lstFilm.SelectedIndex+1).ToString();frmFilmDetailsfd=newfrmFilmDetails(fileName);正如前面我們所介紹的那樣,這部分代碼并不負(fù)責(zé)顯示電影的詳細(xì)信息,只是動態(tài)地添加一個(gè)新的選項(xiàng)卡頁,然后將顯示電影詳細(xì)信息的窗體嵌入其中即可,所以我們操作的重點(diǎn)依然是合成文件名,并將其作為參數(shù)傳遞到電影詳細(xì)信息窗體中即可。3.文件讀取與顯示當(dāng)用戶在ListBox控件中雙擊某一個(gè)電影后,我們需要將其詳細(xì)信息呈現(xiàn)出來,當(dāng)然這個(gè)過程還是從獲取文件名稱開始,采用的方式依然是通過窗體間參數(shù)的傳遞來實(shí)現(xiàn):privatestringfileName=null;publicfrmFilmDetails(stringname){InitializeComponent();this.fileName=name;}這些代碼前面已經(jīng)使用過多次了,這里不再詳述。取得文件名后在窗體的Load事件中我們就可以完成具體的操作了://合成路徑stringpath=Application.StartupPath+"\\Films\\"+fileName+".txt";stringimage=Application.StartupPath+"\\Films\\"+fileName+".jpg";if(File.Exists(path)){//打開文件FileStreamfs=newFileStream(path,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);StreamReadersr=newStreamReader(fs,Encoding.Default);//顯示信息lblName.Text=sr.ReadLine();lblPubDate.Text=sr.ReadLine();lblType.Text=sr.ReadLine();lblActors.Text=sr.ReadLine();lblDesc.Text=sr.ReadLine();picCover.Image=Image.FromFile(image); //關(guān)閉文件sr.Close();fs.Close();}操作過程和上面差不多,首先還是合成文件路徑,這里我們需要兩個(gè)文件的路徑,因?yàn)橐徊侩娪坝袃蓚€(gè)文件:說明文件和封面海報(bào)圖片。接下來通過FileStream對象和StreamReader對象來打開文件。第三步就是通過調(diào)用StreamReader對象的ReadLine()方法來讀取并顯示文件的內(nèi)容。最后在操作完成后關(guān)閉文件流。7.2.3實(shí)現(xiàn)音像店管理4.0新版的音像店管理程序由兩個(gè)文件組成:frmFilmList.cs:publicpartialclassfrmFilmList:Form{publicfrmFilmList(){InitializeComponent();}privatevoidfrmFilmList_Load(objectsender,EventArgse){cboType.SelectedIndex=0;}privatevoidcboType_SelectedIndexChanged(objectsender,EventArgse){//生成文件名stringpath=Application.StartupPath+"\\Films\\"+(cboType.SelectedIndex+1).ToString()+".txt";StreamReadersr=newStreamReader(path,Encoding.Default);lstFilm.Items.Clear();//讀取文件strings=null;while((s=sr.ReadLine())!=null)lstFilm.Items.Add(s);}privatevoidlstFilm_DoubleClick(objectsender,EventArgse){stringfileName=(cboType.SelectedIndex+1).ToString()+(lstFilm.SelectedIndex+1).ToString();//創(chuàng)建新窗體和新選項(xiàng)卡frmFilmDetailsfd=newfrmFilmDetails(fileName);TabPagetp=newTabPage();//設(shè)置選項(xiàng)卡信息fd.TopLevel=false;
fd.Parent=tp;fd.Dock=DockStyle.Fill;//顯示文件內(nèi)容tp.Text=lstFilm.SelectedItem.ToString();tp.Controls.Add(fd);//添加選項(xiàng)卡tabShowInfo.TabPages.Add(tp);fd.Show();//刷新和設(shè)定選項(xiàng)卡tabShowInfo.Refresh();tabShowInfo.SelectedTab=tp;}}在這個(gè)頁面上,電影類型已經(jīng)固定設(shè)置在ComboBox控件中,因此在窗體的Load事件中我們設(shè)定ComboBox控件的選中項(xiàng)為第一項(xiàng)。在ComboBox控件的SelectedIndexChanged事件中我們通過讀取相應(yīng)的文件來動態(tài)地將電影名稱添加到ListBox控件中。而在ListBox控件的DoubleClick事件中,我們則通過對幾個(gè)控件的取值獲取到用戶所要查看的電影的文件名,并且通過TabControl控件將電影的詳細(xì)信息呈現(xiàn)在一個(gè)新的選項(xiàng)卡頁中:frmFilmDetails.cs:publicpartialclassfrmFilmDetails:Form{privatestringfileName=null;publicfrmFilmDetails(stringname){InitializeComponent();this.fileName=name;}privatevoidfrmFilmDetails_Load(objectsender,EventArgse){stringpath=Application.StartupPath+"\\Films\\"+fileName+".txt";stringimage=Application.StartupPath+"\\Films\\"+fileName+".jpg";if(File.Exists(path)){FileStreamfs=newFileStream(path,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);StreamReadersr=newStreamReader(fs,Encoding.Default);lblName.Text=sr.ReadLine();lblPubDate.Text=sr.ReadLine();lblType.Text=sr.ReadLine();lblActors.Text=sr.ReadLine();lblDesc.Text=sr.ReadLine();picCover.Image=Image.FromFile(image);sr.Close();fs.Close();}}}這個(gè)窗體的任務(wù)比較單一,即根據(jù)用戶所選擇的文件讀取電影信息并呈現(xiàn)出來,因此幾乎所有的代碼都寫在窗體的Load事件中,具體代碼我們在前面已經(jīng)講解過了,這里不再詳述。
7.3文件寫入
寫文件和讀文件的操作很相似,所使用的對象為StreamWriter,其使用方式和StreamReader也很相似,語法結(jié)構(gòu)如下:StreamWritersw=newStreamWriter(Streamstream);或StreamWritersw=newStreamWriter(stringpath,boolappend,Encodingencoding);參數(shù)說明:stream:Stream類型必選參數(shù),要寫入的文件流對象。path:string類型必選參數(shù),要寫入的完整的文件路徑。append:bool類型可選參數(shù),確定是否將數(shù)據(jù)追加到文件。如果該文件存在,并且append為false,則該文件被覆蓋。如果該文件存在,并且append為true,則數(shù)據(jù)被追加到該文件中。如果該文件不存在,則將創(chuàng)建新文件。encoding:Encoding類型可選參數(shù),要使用的字符編碼類型。和StreamReader對象一樣,當(dāng)我們需要向一個(gè)文本文件中寫入內(nèi)容的時(shí)候,首先也需要創(chuàng)建一個(gè)文件流對象,只不過這個(gè)流的訪問方式必須選擇Write或者ReadWrite:FileStreamfs=newFileStream("c:\\1.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite);有了文件流對象后我們就可以創(chuàng)建寫入對象:StreamWritersw=newStreamWriter(fs);通過StreamWriter對象的相應(yīng)方法我們就可以完成對文件的寫操作:sw.Write("Hello!");sw.WriteLine("Hello!");這里我們給出了常用的兩個(gè)方法,它們的作用都是將字符串寫入流,區(qū)別在于WriteLine()方法在寫完后會添加一個(gè)換行符,而Write()方法則沒有。另外,如果給出的參數(shù)為null,那么Write()方法不寫入任何內(nèi)容,而WriteLine()方法會寫入一個(gè)行結(jié)束字符。最后一定不要忘記關(guān)閉相關(guān)的對象:sw.Flush();sw.Close();fs.Close();我們發(fā)現(xiàn)在調(diào)用Close()方法之前我們還調(diào)用了Flush()方法,該方法的作用是清理當(dāng)前編寫器的所有緩沖區(qū),并使所有緩沖數(shù)據(jù)寫入基礎(chǔ)流。因?yàn)樵谶M(jìn)行文件寫操作的時(shí)候,當(dāng)我們調(diào)用Write()或者WriteLine()方法后,我們所給出的信息實(shí)際上并沒有真正地寫入到磁盤中,而是暫時(shí)保存在了系統(tǒng)的緩存中,只有當(dāng)緩存被裝滿或者有明確的指令后,這些信息才會真正地寫入磁盤文件。因此,如果在結(jié)束操作之前沒有給出系統(tǒng)寫磁盤文件的指令,除非我們運(yùn)氣特別好剛好碰到磁盤存滿的情況,否則我們的信息是不會被寫入到磁盤文件的。
7.4我的便簽
7.4.1問題“我的便簽”是一個(gè)小程序,能夠?qū)崿F(xiàn)對文本文件的讀寫操作,其運(yùn)行效果如圖7-3所示。具體要求如下:(1)窗體的工具欄包含7個(gè)按鈕,分別是:新建、打開、保存、剪切、復(fù)制、粘貼和退出。(2)便簽的顯示仍然采用TabControl控件來實(shí)現(xiàn)。7.4.2需求分析1.工具欄工具欄在Windows應(yīng)用程序中很常見,它一般是由多個(gè)按鈕、標(biāo)簽等排列組成的,主要是提供一種便捷的方式來快速地執(zhí)行程序提供的一些常用命令,比使用菜單選擇更加方便快捷。在WinForm中,制作工具欄的控件是ToolStrip,該控件通常沿其父窗口頂部“停靠”,但是也可以將它停靠到窗口的任一邊上。向Windows窗體中添加一個(gè)ToolStrip控件后,窗體頂端會出現(xiàn)一個(gè)工具欄,如圖7-4所示,單擊工具欄上的小箭頭,彈出下拉菜單,其中每一項(xiàng)都是可以使用在工具欄上的項(xiàng)類型,常用的有Button按鈕、Label標(biāo)簽、ComboBox下拉框等控件,單擊某項(xiàng)即可添加到工具欄上。也可以通過ToolStrip控件的Items屬性打開“項(xiàng)集合編輯器”來完成工具欄的編輯,如圖7-5所示。除了用上述兩種方式,我們也可以通過代碼來添加按鈕:toolStrip1.Items.Add("One");toolStrip1.Items.Add("Two");選中添加到工具欄上的按鈕,可以在屬性窗口中看到其屬性列表。工具欄按鈕常用的屬性有:Name:用來設(shè)置控件的名稱,其前綴采用btn。Image:用于設(shè)置控件上所呈現(xiàn)出來的圖片,一般情況下工具欄都是通過圖片的方式來說明其相應(yīng)的功能。Text:用于設(shè)置控件上所呈現(xiàn)的文本內(nèi)容。DisplayStyle:用于設(shè)置控件的呈現(xiàn)方式,可以選擇不呈現(xiàn)任何內(nèi)容(None)、只顯示文本(Text)、只顯示圖片(Image)或者同時(shí)顯示圖片和文字(ImageAndText)。ToolTipText:用于設(shè)置當(dāng)鼠標(biāo)懸停在控件上時(shí)所呈現(xiàn)出來的提示信息。如果是分隔欄則沒有任何屬性。按鈕和分隔欄都沒有常用的方法,按鈕的常用事件是Click,即被單擊時(shí)所觸發(fā)的事件。2.跨窗體控件訪問在我們的程序中需要實(shí)現(xiàn)幾個(gè)比較常見的功能:剪切、復(fù)制和粘貼。這些功能是不需要我們具體實(shí)現(xiàn)的,因?yàn)橄到y(tǒng)的RichTextBox控件已經(jīng)為我們提供了相應(yīng)功能實(shí)現(xiàn)的方法,難點(diǎn)在于RichTextBox控件在信息呈現(xiàn)的窗體中,而功能菜單卻在主窗體上,所以需要解決的問題是如何跨窗體調(diào)用控件的方法。仔細(xì)分析一下我們會發(fā)現(xiàn),這個(gè)問題的焦點(diǎn)其實(shí)有兩個(gè):如何公開方法以及如何訪問控件。因此解決的過程也需要兩步。首先,我們必須將RichTextBox控件本身所提供的方法公開出來,默認(rèn)情況下控件是作為窗體的私有成員存在的,也就是說在窗體的外部無法訪問窗體控件,因此才需要進(jìn)行這個(gè)操作。當(dāng)然實(shí)現(xiàn)的過程并不復(fù)雜,例如我們可以這樣將RichTextBox控件的剪切方法公開出來:publicvoidCut(){txtInfo.Cut();}經(jīng)過這樣的轉(zhuǎn)換,原來私有成員的方法就變成了窗體的公有方法,這樣外部用戶便可以訪問,這就是我們要解決的第二個(gè)問題了,即外部用戶如何訪問。當(dāng)然最簡單的方式就是創(chuàng)建窗體的對象,然后通過對象來訪問:frmInfofi=newfrmInfo();fi.Cut();當(dāng)然這種方式實(shí)際上沒有什么使用價(jià)值,因?yàn)槲覀儾豢赡茉谟脩裘看吸c(diǎn)擊菜單的時(shí)候都創(chuàng)建一個(gè)窗體對象,而且即使這樣做了,我們最終所操作的窗體對象也不是原來用戶期望操作的窗體對象,所以我們還是要另外想辦法。事實(shí)上,不論是新建文件還是打開文件,我們都需要創(chuàng)建一個(gè)用來顯示文件內(nèi)容的窗體對象,而且這個(gè)對象會一直存在,只不過這個(gè)窗體對象被我們“放”在了選項(xiàng)卡頁中:frmInfofi=newfrmInfo(path);TabPagetp=newTabPage();tp.Controls.Add(fi);因此,只要能夠?qū)⑦@個(gè)窗體對象從選項(xiàng)卡頁中“拿”出來,我們就可以方便地調(diào)用其定義的方法了:((frmInfo)tabControl1.SelectedTab.Controls[0]).Cut();上面的代碼看起來比較復(fù)雜,為了便于理解,我們將其拆開來寫:Controlctr=tabControl1.SelectedTab.Controls[0];frmInfofi=(frmInfo)ctr;fi.Cut();事實(shí)上這個(gè)過程并不復(fù)雜,既然我們前面就已經(jīng)將窗體對象添加到了選項(xiàng)卡頁的Controls集合中,那我們就可以通過下標(biāo)的方式將其提取出來,只不過提取出來的是一個(gè)Control類型的對象,因此在第二行代碼中我們將其轉(zhuǎn)換為窗體類型,完成這兩步后就可以很簡單地調(diào)用窗體對象的方法了。7.4.3實(shí)現(xiàn)“我的便簽”在完成了需求分析后,我們就可以具體實(shí)現(xiàn)程序了:frmNote.cspublicpartialclassfrmNote:Form{publicfrmNote(){InitializeComponent();}//新建便簽privatevoidbtnNew_Click(objectsender,EventArgse){frmInfofi=newfrmInfo(null);TabPagetp=newTabPage();
fi.TopLevel=false;fi.Parent=tp;fi.Dock=DockStyle.Fill;tp.Text="新建便簽";tp.Tag=null;tp.Controls.Add(fi);tabControl1.TabPages.Add(tp);tabControl1.SelectedTab=tp;fi.Show();}//打開便簽privatevoidbtnOpen_Click(objectsender,EventArgse){
openFileDialog1.Filter="便簽文件|*.txt";openFileDialog1.ShowDialog();stringpath=openFileDialog1.FileName;if(File.Exists(path)){frmInfofi=newfrmInfo(path);TabPagetp=newTabPage();fi.TopLevel=false;fi.Parent=tp;fi.Dock=DockStyle.Fill;tp.Text=Path.GetFileName(path);tp.Tag=path;tp.Controls.Add(fi);tabControl1.TabPages.Add(tp);tabControl1.SelectedTab=tp;fi.Show();}}//保存便簽privatevoidbtnSave_Click(objectsender,EventArgse){stringpath=null;if(tabControl1.SelectedTab.Tag==null){saveFileDialog1.Filter="便簽文件|*.txt";saveFileDialog1.ShowDialog();path=saveFileDialog1.FileName;
}elsepath=tabControl1.SelectedTab.Tag.ToString();((frmInf
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 部編初中歷史八下第1課中華人民共和國成立教案
- 2025年全球及中國大型不銹鋼鑄件行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球化妝品級枯草菌脂肽鈉行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球光纖導(dǎo)管靜脈激光治療行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國銅纜高速連接器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025國際(非獨(dú)占)商標(biāo)使用許可合同
- 2025農(nóng)業(yè)種植生產(chǎn)產(chǎn)銷合同書
- 餐飲業(yè)合同年
- 2025室內(nèi)裝修設(shè)計(jì)合同范本
- 房屋租賃續(xù)簽合同模板
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- 醫(yī)保政策與健康管理培訓(xùn)計(jì)劃
- 策略與博弈杜塔中文版
- 無人化農(nóng)場項(xiàng)目可行性研究報(bào)告
- 2024屆上海市金山區(qū)高三下學(xué)期二模英語試題(原卷版)
- 學(xué)生春節(jié)安全教育
- 2024-2025年校長在教研組長和備課組長會議上講話
- 2025屆江蘇省常州市高級中學(xué)高三第二次模擬考試語文試卷含解析
- 高三日語一輪復(fù)習(xí)助詞「で」的用法課件
- 2024-2030年中國銣銫及其化合物行業(yè)深度調(diào)研及投資戰(zhàn)略分析報(bào)告
- 散貨物流行業(yè)市場調(diào)研分析報(bào)告
評論
0/150
提交評論