




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章WinForm基礎(chǔ)(三)6.1消息框6.2對話框6.3圖片瀏覽器
6.1消息框
在Windows應(yīng)用程序中,我們經(jīng)常需要和用戶進行一些簡單的交流,這些交流的過程一般來說涉及的信息量都不是很大,操作也不復(fù)雜,對于這種類型的操作我們就不需要再單獨制作窗體了,可以直接使用系統(tǒng)提供的消息框。圖6-1就是一個典型的系統(tǒng)對話框。6.1.1語法結(jié)構(gòu)MessageBox類是系統(tǒng)定制好的消息框類,它在使用的時候是不用實例化的,直接調(diào)用其Show()方法就可以了,其最常用的語法結(jié)構(gòu)如下:MessageBox.Show(stringtext[stringcaption,MessageBoxButtonsbuttons,MessageBoxIconicon]);我們可以看到這個方法帶有4個參數(shù),這些參數(shù)的作用是:text:必選參數(shù),string類型,要在消息框上呈現(xiàn)的文本。caption:可選參數(shù),string類型,要在消息框的標題欄中顯示的文本。buttons:可選參數(shù),MessageBoxButtons類型,MessageBoxButtons值之一,指定在消息框中顯示哪些按鈕。表6-1列出了MessageBoxButtons的可取值及其描述。icon:可選參數(shù),MessageBoxIcon類型,MessageBoxIcon值之一,指定在消息框中顯示哪個圖標。表6-2列出了MessageBoxIcon可取值及其描述。Show()方法的返回是DialogResult類型的,其值是DialogResult的值之一,用來確定用戶的選擇結(jié)果。表6-3列出了DialogResult的可取值及其描述。6.1.2使用消息框看起來比較復(fù)雜,但是使用起來卻非常簡單,在最簡單的情況下,我們甚至可以只給出一個參數(shù)來使用它:MessageBox.Show("HelloC#!");當然,這樣的消息框是很簡陋的,內(nèi)容只是我們所給出的文本,沒有標題和圖標,所以看起來很不專業(yè),而且只有一個“確定”按鈕,如圖6-2所示。這么簡單的消息框不要說用戶,就是開發(fā)人員都不會滿意,所以我們要給出更多的參數(shù)以制作更加專業(yè)的消息框:MessageBox.Show("HelloC#!","系統(tǒng)消息",MessageBoxButtons.OK,MessageBoxIcon.Information);這一次我們給出了Show()方法完整的四個參數(shù),除了第一個參數(shù)沒有變化外,我們還添加了“系統(tǒng)消息”作為消息框的標題,按鈕指定采用“OK”,也就是“確定”按鈕,圖標則采用“Information”,其運行效果如圖6-3所示。這樣的消息框看起來就專業(yè)多了,但是它還是無法實現(xiàn)和用戶的交互操作,因此我們還需要對消息框進行更進一步的改進,這個時候改進的重點就放在了Show()方法的后兩個參數(shù)了:if(MessageBox.Show("刪除選中的電影?","系統(tǒng)消息",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes){//執(zhí)行刪除操作}和上面的代碼相比,我們只是做了簡單的調(diào)整,按鈕由原來的“OK”變成了“YesNo”,這樣消息框中就出現(xiàn)了兩個按鈕,圖標也從“Information”變成了“Question”。既然是兩個按鈕,那就會有兩種反饋結(jié)果,因此我們通過一個if結(jié)構(gòu)對消息框的返回進行判斷,使用的是DialogResult,如果其值為“Yes”,則說明用戶點擊了“是(Y)”按鈕,其運行效果如圖6-4所示。
6.2對話框
對話框是WinForm中另外一種交互控件,它們常用的有5個,分別是:OpenFileDialog、SaveFileDialog、ColorDialog、FontDialog和FolderBrowserDialog。這5個控件具有相似的操作、方法和屬性,它們的作用就是通過對話框的方式來實現(xiàn)和用戶的交互。6.2.1OpenFileDialogOpenFileDialog控件的作用是提示用戶打開文件,其常用的屬性有:FileName:獲取或設(shè)置用戶通過文件對話框所選定的文件名的字符串。FileNames:獲取對話框中所有選定文件的文件名。Filter:獲取或設(shè)置當前文件名篩選器字符串,其書寫格式為:篩選器名稱|篩選器。Multiselect:指示對話框是否允許選擇多個文件。常用的方法只有ShowDialog()這一個,即打開對話框的方法,不過在使用的時候我們都會先設(shè)置文件篩選器:openFileDialog1.Filter="文本文件(*.txt)|*.txt";openFileDialog1.ShowDialog();stringfile=openFileDialog1.FileName;在上面的代碼中,我們首先設(shè)定了文件篩選器為只能夠看到txt類型的文件,然后打開對話框,用戶選擇文件后將其放到一個string類型的變量中,其運行效果如圖6-5所示。我們發(fā)現(xiàn),在上面的對話框中盡管文件夾下有很多文件,但是只有文本文件才能夠通過篩選器并顯示出來,并且默認情況下我們只能夠選擇一個文件,如果需要選擇多個文件,可以將Multiselect屬性設(shè)置為True。另一個經(jīng)常碰到的問題是篩選器,如果要篩選多種類型的文件該怎么辦?例如,我們用一個對話框要求用戶打開圖片,可是圖片可以是BMP類型,也可以是JPEG或別的類型,這時篩選器就可以寫成這樣:openFileDialog1.Filter="圖片(*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png";這樣的篩選器就可以同時篩選多種類型的文件。我們甚至可以將篩選器寫成這樣的:openFileDialog1.Filter="圖片(BMP/JPG/PNG)|*.bmp;*.jpg;*.png|文本文件(TXT/RTF/DOC)|*.txt;*.rtf;*.doc|所有文件|*.*";我們可以看到,通過一個“|”符號,我們可以同時設(shè)置多個篩選器,運行的時候系統(tǒng)會自動將這些篩選器進行分割,如圖6-6所示。6.2.2SaveFileDialogSaveFileDialog控件和OpenFileDialog控件很相似,常用的屬性和方法也都一樣,區(qū)別在于SaveFileDialog控件多了兩個屬性:CreatePrompt:獲取或設(shè)置一個值,該值指示如果用戶指定不存在的文件,對話框是否提示用戶允許創(chuàng)建該文件。OverwritePrompt:獲取或設(shè)置一個值,該值指示如果用戶指定的文件名已存在,對話框是否顯示警告。由于SaveFileDialog和OpenFileDialog對話框的使用方式是一樣的,因此這里我們不再對其做過多的討論。6.2.3ColorDialogColorDialog對話框的作用是讓用戶通過它來選擇一個顏色或者允許用戶定義自定義顏色。該對話框的常用屬性有:AllowFullOpen:指示用戶是否可以使用該對話框定義自定義顏色。Color:獲取或設(shè)置用戶選定的顏色。FullOpen:指示用于創(chuàng)建自定義顏色的控件在對話框打開時是否可見。打開ColorDialog對話框也是使用ShowDialog()方法:colorDialog1.ShowDialog();根據(jù)屬性設(shè)置的差別,對話框打開后的樣式也有所區(qū)別,如圖6-7所示。無論采用哪種樣式,ColorDialog對話框返回的都是一個Color對象:Colorcol=colorDialog1.Color;6.2.4FolderBrowserDialog用戶在實際的使用過程中,除了會選擇文件之外,也可能需要選擇一個文件夾,這個時候我們就需要FolderBrowserDialog對話框了,它的作用是提供一種方法,讓用戶可以瀏覽、創(chuàng)建并最終選擇一個文件夾。需要注意的是,該對話框只允許用戶選擇文件夾而非文件。文件夾的瀏覽通過樹控件完成,通過這個對話框我們可以選擇文件系統(tǒng)中的文件夾,但是不能選擇虛擬文件夾。FolderBrowserDialog對話框常用的屬性有:Description:獲取或設(shè)置對話框中在樹視圖控件上顯示的說明文本。RootFolder:獲取或設(shè)置從其開始瀏覽的起始文件夾。SelectedPath:獲取或設(shè)置用戶選定的路徑。ShowNewFolderButton:指示是否在文件夾瀏覽對話框中顯示“新建文件夾”按鈕。打開FolderBrowserDialog對話框也是使用ShowDialog()方法:folderBrowserDialog1.ShowDialog();根據(jù)屬性設(shè)置的差別,對話框打開后的樣式也有所區(qū)別,如圖6-8所示。不管采用哪種樣式,F(xiàn)olderBrowserDialog對話框返回的都是一個包含用戶所選擇的文件夾的字符串:stringpath=folderBrowserDialog1.SelectedPath;6.2.5FontDialogFontDialog對話框的作用是幫助用戶從本地計算機上安裝的字體中選擇一種字體,其常用屬性有:AllowScriptChange:用戶能否更改指定的字符集。AllowSimulations:指示對話框是否允許更改字體模擬。Font:獲取或設(shè)置選定的字體。ShowApply:對話框是否包含“應(yīng)用”按鈕。ShowColor:對話框是否顯示顏色選擇。ShowEffects:對話框是否包含允許用戶指定刪除線、下劃線和文本顏色選項的控件。FontDialog對話框的打開方法也是ShowDialog():fontDialog1.ShowDialog();根據(jù)屬性設(shè)置的差別,對話框打開后的樣式也有所區(qū)別,如圖6-9所示。不管采用哪種樣式,F(xiàn)ontDialog對話框都返回一個Font對象:textBox1.Font=fontDialog1.Font;
6.3圖片瀏覽器
6.3.1問題首先我們制作一個簡單的圖片瀏覽器,其運行效果如圖6-10所示。整個應(yīng)用程序只有一個簡單的窗體,操作是由一個右鍵彈出菜單和兩個圖片組成的,具體要求如下:(1)窗體加載的時候不顯示任何圖片,同時“上一張”和“下一張”按鈕不可用。(2)在窗體上右鍵單擊彈出菜單,菜單包括“打開圖片”、“打開文件夾”、“圖片另存為”和“退出”。點擊“打開圖片”菜單,打開一個對話框讓用戶選擇一張JPG圖片并顯示,“上一張”和“下一張”按鈕不可用,如圖6-11所示。(3)點擊“打開文件夾”菜單,打開一個對話框讓用戶選擇一個文件夾,并顯示該文件夾下的第一張圖片,“上一張”和“下一張”按鈕變?yōu)榭捎茫鐖D6-12所示。(4)點擊“圖片另存為”菜單,打開一個對話框讓用戶選擇另存為圖片的路徑和名稱。(5)點擊“退出”菜單,關(guān)閉窗體并退出系統(tǒng)。6.3.2需求分析圖片瀏覽器中的大部分功能所使用到的技能點我們在前面的章節(jié)中都已經(jīng)學(xué)習(xí)到了,接下來我們將從三個方面進行深入的分析。1.窗體制作本次我們制作的小程序所包含的控件并不多,表6-4中列出了所有的控件及其屬性設(shè)置。這些控件和屬性大部分我們在前面的章節(jié)中都學(xué)習(xí)過,這里需要注意的是Dock和Anchor屬性以及Splitter控件。Dock和Anchor屬性都是用來控制控件的布局的,WinForm中幾乎所有的控件都具有這兩個屬性。具體來說,我們在制作窗體的時候都會遇到這樣的問題:一旦用戶更改了窗體的大小,我們原來設(shè)計好的窗體就會變得面目全非。其原因就在于控件在窗體上定位的時候是以其左頂點的坐標為基準的,因此控件默認情況下和窗體的左邊和頂端的距離保持不變,當窗體的大小發(fā)生變化時,自然就會破壞布局。解決方法是合理地使用控件的Dock屬性和Anchor屬性。Dock屬性用來設(shè)定控件的??糠绞健K^???,就是指定控件與其父控件的哪條邊對齊,同時在調(diào)整控件的父控件大小時自動調(diào)整控件的大小。例如,將Dock設(shè)置為DockStyle.Left將導(dǎo)致控件與其父控件的左邊緣對齊,并在父控件調(diào)整大小時調(diào)整自身大小,如圖6-13所示。Anchor屬性則是將控件綁定到容器的邊緣并確定控件隨其父控件一起調(diào)整大小。使用Anchor屬性可以定義在調(diào)整控件的父控件大小時如何自動調(diào)整控件的大小。將控件錨定到其父控件后,可確保當調(diào)整父控件的大小時錨定的邊緣與父控件的邊緣的相對位置保持不變,如圖6-14所示。需要注意的是,Anchor和Dock屬性是互相排斥的,即每次只可以設(shè)置其中的一個屬性,最后設(shè)置的屬性優(yōu)先。另外一個需要注意的是Splitter控件,它是一個界面的拆分器,允許用戶調(diào)整??靠丶拇笮?。Splitter控件使用戶可以在運行時調(diào)整??康絊plitter控件邊緣的控件的大小。當我們將鼠標指針移到Splitter控件上時,光標將更改以指示可以調(diào)整??康絊plitter控件的那些控件的大小。在使用Splitter控件時,我們首先需要將希望能夠調(diào)整大小的控件??康揭粋€容器的邊緣,然后將拆分器??康皆撊萜鞯耐粋?cè)。當然我們不是為了調(diào)整圖片的大小,而是為了讓圖片能夠隨著窗體一起改變,因此要將Splitter控件的Enabled屬性設(shè)定為False。2.多圖片讀取與查看在圖片瀏覽器中,有一個功能比較復(fù)雜,即“打開文件夾”功能,它需要我們將用戶所選擇的文件夾下的所有*.jpg類型的文件都找出來,并且能夠循環(huán)查看。這里的難點有兩個:如何查找文件夾下的圖片文件和如何循環(huán)查看圖片。查看某個文件夾下指定類型的文件,我們可以使用位于System.IO名稱空間下的Directory類,它提供了一個靜態(tài)方法GetFiles()可以幫助我們在指定的文件夾下查找文件,其語法結(jié)構(gòu)如下:publicstaticstring[]GetFiles(stringpath[,stringsearchPattern, SearchOptionsearchOption])該方法是一個靜態(tài)方法,因此在使用的時候不需要對象,直接通過Directory類調(diào)用,它帶有三個參數(shù):Path:string類型,所要操作的文件夾。searchPattern:string類型可選參數(shù),文件篩選器。SearchOption:SearchOption類型可選參數(shù),指定搜索時是否包含子目錄。該方法返回一個字符串類型的數(shù)組,也就是所有符合條件的文件的路徑。在圖片瀏覽器中,我們可以通過對話框讓用戶選擇路徑,然后使用該方法來完成對所有圖片文件的搜索:folderBrowserDialog1.ShowDialog();stringpath=folderBrowserDialog1.SelectedPath;if(!string.IsNullOrEmpty(path)){string[]files=Directory.GetFiles(path,"*.jpg");}在上面的代碼中,我們首先通過ShowDialog()方法打開了一個FolderBrowserDialog對話框,然后通過一個字符串變量來取得用戶所選擇的路徑。當然,用戶可能選擇了一個路徑,也可能沒有選擇,因此接下來我們通過一個if結(jié)構(gòu)來進行判斷,判斷的方式就是通過string類所提供的靜態(tài)方法IsNullOrEmpty(),這個方法可以判斷指定的字符串是否為空。如果通過了驗證,則在接下來的代碼中通過GetFiles()方法來讀取文件信息,這里我們所采用的篩選條件是所有的jpg文件。這里我們需要格外注意searchPattern這個參數(shù)。首先,它可以使用“*”和“?”通配說明符,前者通配零個或多個字符,后者通配零個或一個字符。例如,searchPattern字符串“*t”搜索path中所有以字母“t”結(jié)尾的名稱,searchPattern字符串“s*”搜索path中所有以字母“s”開頭的名稱。另外,在searchPattern中使用星號通配符(如“*.txt”)時,擴展名長度正好為三個字符時的匹配行為與擴展名長度多余或少于三個字符時的匹配行為有所不同。文件擴展名正好是三個字符的searchPattern將返回擴展名為三個或更多字符的文件,其中前三個字符與searchPattern中指定的文件擴展名匹配。文件擴展名為一個、兩個或三個以上字符的searchPattern僅返回擴展名長度正好與searchPattern中指定的文件擴展名匹配的文件。使用問號通配符字符時,則僅返回與指定文件擴展名匹配的文件。例如,假設(shè)目錄下有兩個文件“file1.txt”和“file1.txtother”,使用“file?.txt”搜索模式時只返回第一個文件,而使用“file*.txt”搜索模式時會同時返回這兩個文件。接下來我們就需要將圖片展示出來了,這個過程我們在前面已經(jīng)學(xué)習(xí)過了,通過Image類的FromFile()方法即可實現(xiàn):picShowPic.Image=Image.FromFile(path);問題的焦點就在于該方法的參數(shù)上,它需要一個string類型的參數(shù),將文件的路徑傳遞進來,而我們通過上面的GetFiles()方法獲得的是一個包含很多文件路徑的字符串數(shù)組,于是很自然地我們就想到了通過下標來提取數(shù)組中的指定路徑并顯示:picShowPic.Image=Image.FromFile(files[index]);通過變換index的值,我們就可以隨意提取數(shù)組中的某一個文件來顯示。3.圖片另存圖片的轉(zhuǎn)存是我們這個小程序中最難的一部分,其最理想的實現(xiàn)方式就是采用文件流的方式,即將一個圖片文件讀入到內(nèi)存中的一個文件流對象中,再將這個文件流對象寫入到另一個圖片文件中,但是這已經(jīng)大大超出了本章所學(xué)習(xí)的內(nèi)容,因此我們需要采用文件拷貝的方式來實現(xiàn)。事實上,文件拷貝的實現(xiàn)過程也不難理解,就是將源文件通過相應(yīng)的方法拷貝到用戶指定的新路徑中,從而實現(xiàn)另存為的功能。這里我們就要用到System.IO名稱空間下的File類了,這個類是用來進行文件操作的,在它的眾多方法中有一個Copy()方法可以用來進行文件拷貝,其語法如下:publicstaticvoidCopy(stringsourceFileName,stringdestFileName[,booloverwrite])該方法也是一個靜態(tài)方法,并且?guī)в腥齻€參數(shù):sourceFileName:string類型,要復(fù)制的源文件。destFileName:string類型,目標文件。overwrite:bool類型可選參數(shù),是否允許覆蓋目標文件。仔細觀察這個方法我們就會發(fā)現(xiàn),現(xiàn)在問題的焦點集中在兩個路徑上了,也就是源文件路徑和目標文件路徑。對于目標文件路徑我們通過一個SaveFileDialog對話框就可以很容易地取得,但是源文件的路徑該如何取得呢?其實在前面顯示圖片環(huán)節(jié)我們已接觸過圖片的路徑,也就是說我們在前面的操作中已經(jīng)取得了源文件的路徑,只不過我們將其顯示出來后就沒再繼續(xù)使用這個路徑了,現(xiàn)在我們只需要將其用于這里即可。當然這需要幾個步驟,首先需要將其保存起來,方式有很多種,這里我們采用PictureBox控件Tag屬性:pictureBox1.Tag=files[index];Tag屬性主要是用來存放用戶自定義的數(shù)據(jù),這里剛好用來存放圖片的路徑。接下來我們還要將其取出來:stringsource=pictureBox1.Tag.ToString();因為Tag屬性是一個object類型的,因此這里通過ToString()方法將其轉(zhuǎn)換為string類型的。當然,這不是唯一的辦法,通過一個全局變量或者一個Label控件也可以達到同樣的目的,這么做的原因只是讓我們多一種選擇?,F(xiàn)在我們已經(jīng)獲得了文件拷貝的所有元素,接下來就可以完成這個過程了:saveFileDialog1.ShowDialog();stringfile=saveFileDialog1.FileName;if(!string.IsNullOrEmpty(file)){stringsource=pictureBox1.Tag.ToString();File.Copy(source,file);}在上面的代碼中我們首先通過一個SaveFileDialog對話框取得用戶所要另存圖片的路徑,當然這個路徑是要經(jīng)過驗證的。如果驗證通過,則將保存在PictureBox控件的Tag屬性中的源文件路徑提取出來,最后通過File類的Copy方法來完成圖片的拷貝。6.3.3實現(xiàn)圖片瀏覽器經(jīng)過上一階段的學(xué)習(xí),我們就可以完成圖片瀏覽器了:publicpartialclassfrmPicViewer:Form{string[]files=null;intindex=0;publicfrmPicViewer(){InitializeComponent();}//打開一張圖片privatevoidmnuOpenPic_Click(objectsender,EventArgse){dlgOpenFile.ShowDialog();stringfile=dlgOpenFile.FileName;if(!string.IsNullOrEmpty(file)){picShowPic.Image=Image.FromFile(file);picShowPic.Tag=file;lblMsg.Text="1/1";picPrev.Enabled=false;picNext.Enabled=false;}}//打開多張圖片privatevoidmnuOpenFolder_Click(objectsender,EventArgse){dlgOpenFolder.ShowDialog();stringpath=dlgOpenFolder.SelectedPath;picPrev.Enabled=true;picNext.Enabled=true;if(!string.IsNullOrEmpty(path)){files=Directory.GetFiles(path,"*.jpg");ShowPic();}}//顯示圖片privatevoidShowPic(){if(index<0)index=files.Length-1;if(index>files.Length-1)index=0;picShowPic.Image=Image.FromFile(files[index]);picShowPic.Tag=files[index];lblMsg.Text=(index+1).ToString()+"/"+(files.Length+1).ToString();}//下一張圖片privatevoidpicNext_Click(objectsender,EventArgse){index++;ShowPic();}//上一張圖片privatevoidpicPrev_Click(objectsender,EventArgse){index--;ShowPic();}//圖片另存為privatevoidmnuSaveAs_Click(objectsender,EventArgse){dlgSaveAs.ShowDialog();stringfile=dlgSaveAs.FileName;if(!string.IsNullOrEmpty(file)){
stringsource=picShowPic.Tag.ToString();File
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年壓力和真空傳感器項目投資可行性研究分析報告
- 高層建筑施工材料供應(yīng)計劃
- 地下室砌筑防潮措施與設(shè)計
- 公共交通設(shè)施玻璃門施工流程
- 銷售團隊案例分析提升業(yè)績心得體會
- 文化產(chǎn)業(yè)行政后勤崗位職責(zé)
- 房地產(chǎn)公司戰(zhàn)略規(guī)劃職責(zé)
- 房地產(chǎn)公司綜合辦公室安全職責(zé)
- 第13課《唐詩五首》課件統(tǒng)編版語文八年級上冊
- 隧道施工管理措施及其環(huán)境保護方案
- 2025屆遼寧省葫蘆島市第二次模擬考試二模英語試題(原卷版+解析版)
- 2025新疆交投集團所屬子公司招56人筆試參考題庫附帶答案詳解
- 2025-2030年中國銅合金散熱器材料行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 醫(yī)療器械銷售流程與技巧
- 黑龍江省農(nóng)村信用社聯(lián)合社員工招聘考試真題2024
- 2025上海車展專題報告
- 紡織承包合同協(xié)議書
- 軟件轉(zhuǎn)讓合同協(xié)議書
- 2025年北京市豐臺區(qū)中考數(shù)學(xué)一模試卷
- 續(xù)簽采購合同范本(標準版)
- 智能垃圾分類箱項目投資商業(yè)計劃書范本(投資融資分析)
評論
0/150
提交評論