自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

VB.NET動(dòng)態(tài)代碼三個(gè)案例分析

開發(fā) 后端
文章主要就VB.NET動(dòng)態(tài)代碼問題做出三個(gè)例子:1.向FlowLayoutPanel中添加新的鏈接 2.處理動(dòng)態(tài)控件點(diǎn)擊事件 3.動(dòng)態(tài)編碼示例

有朋友為VB.NET動(dòng)態(tài)代碼的問題煩惱的嗎?今天我就這個(gè)問題來為大家總結(jié)點(diǎn)小技巧,首先是當(dāng)程序員需要?jiǎng)討B(tài)建立一個(gè)控件并將代碼附著于控件之上時(shí)。例如,你或許想創(chuàng)建一個(gè)鏈接列表,但是不知道需要?jiǎng)?chuàng)建鏈接的數(shù)量或是鏈接中會(huì)出現(xiàn)什么樣的數(shù)據(jù)。第二種是當(dāng)程序員需要定義代碼以反映出特殊需求的時(shí)候。例如,你或許要執(zhí)行能反映用戶系統(tǒng)配置的代碼。

類似上述的情況當(dāng)然不會(huì)每天都上演。事實(shí)上,它們只在非常情況下才出現(xiàn)。然而,作為程序員,仍然要意識(shí)到.NET為解決動(dòng)態(tài)情形提供了方案。有了正確的技巧,你就可以寫出能靈活處理動(dòng)態(tài)情況的應(yīng)用程序了。

使用動(dòng)態(tài)控件

許多程序員總會(huì)遇到需要?jiǎng)討B(tài)創(chuàng)建控件的時(shí)候。我們所展示的例子中程序員向FlowLayoutPanel中添加了LinkLabels。或許你可以個(gè)這樣的設(shè)置來記錄和保存常用的URL,文件,網(wǎng)絡(luò)地址或是其他資源所在位置的數(shù)值。這一示例沒有真正保存鏈接,但是你可以使用XML序列化功能來實(shí)現(xiàn)保存。每次當(dāng)用戶點(diǎn)擊Test按鈕時(shí),示例代碼就會(huì)動(dòng)態(tài)創(chuàng)建一個(gè)新的LinkLabel控件。真正的演示代碼并不復(fù)雜。例一就展示了創(chuàng)建這類控件以及將控件放入FlowLayoutPanel,lstLabel中通常所需要做的一切。

VB.NET動(dòng)態(tài)代碼例一:向FlowLayoutPanel中添加新的鏈接

  1. Private SubbtnTest_Click()  
  2. HandlesbtnTest.Click  
  3. 'Createalink.  
  4. DimNewLinkAsLinkLabel=NewLinkLabel()  
  5. 'Addsomepropertiestoit.  
  6. NewLink.Text=DateTime.Now.ToLongTimeString()  
  7. 'Settheclickeventhandler.  
  8. AddHandlerNewLink.Click,AddressOfNewLink_Click  
  9. 'Placethebuttonontheform.  
  10. lstLinks.Controls.Add(NewLink)  
  11. End Sub 

如你所料,該代碼開始的時(shí)候創(chuàng)建了一個(gè)新的LinkLabel并為其賦予了一些值。這一示例使用的是當(dāng)前時(shí)間。你的代碼或許能夠?qū)δ骋徽鎸?shí)資源進(jìn)行訪問。

請(qǐng)注意該代碼也向鏈接的Click事件中指定了一個(gè)處理程序。你必須使用示例中的AddHandler技巧,因?yàn)槠胀ǖ腍andles關(guān)鍵詞路徑不起作用。一方面,設(shè)計(jì)應(yīng)用程序的時(shí)候你并不清楚控件的名稱。即便你為控件指定了一個(gè)名稱,你也不知道用戶要?jiǎng)?chuàng)建的控件數(shù)量,所以我們沒有辦法清楚會(huì)有多少處理程序會(huì)被創(chuàng)建。處理程序的代碼與控件代碼類似,因此沒有必要?jiǎng)?chuàng)建多個(gè)處理程序。用于這個(gè)示例的處理代碼見例二。

VB.NET動(dòng)態(tài)代碼例二:處理動(dòng)態(tài)控件點(diǎn)擊事件

  1. PrivateSubNewLink_Click(_ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)  
  2. 'VerifythatyouactuallyhaveaLinkLabel  
  3. IfNotsender.GetType()IsGetType(LinkLabel)  
  4. ThenMessageBox.Show("Wrongcontroltypeprovided!")  
  5. Return  
  6. End  
  7. If  
  8. 'ConverttheinputsendertoaButton.  
  9. DimThisLinkAsLinkLabel=sender 
  10. 'Showthatwehavethecorrectbutton.  
  11. MessageBox.Show("Youcreatedthislinkat:"+ThisLink.Text)  
  12. End Sub 

你可能已經(jīng)注意到例一中的事件處理器使用的是寬松代表——它沒有將ByVal發(fā)送器作為System.Object,也沒有將ByVale作為System.EventArgs作為參數(shù)因?yàn)樗恍枰@二者。然而,當(dāng)你創(chuàng)建一個(gè)事件處理器來動(dòng)態(tài)創(chuàng)建控件時(shí),通常你需要將ByVal發(fā)送器作為System.Object參數(shù),這意味著將這兩者都包含其中。

有些程序員在創(chuàng)建事件處理器的時(shí)候會(huì)出現(xiàn)一個(gè)錯(cuò)誤,即沒有檢查傳入控件的類型。發(fā)送器對(duì)象可能包含多選擇,而如果未對(duì)事件處理器進(jìn)行事件處理類型的設(shè)置,那么你就會(huì)面臨更多的選擇。我們的示例代碼一開始就檢查了傳入控件對(duì)象的類型。這樣以來發(fā)送器就不會(huì)像下面所展示的代碼一樣:

  1. PrivateSubbtnTest2_Click()HandlesbtnTest2.Click  
  2. 'Createalink.  
  3. DimNewButtonAsButton=NewButton()  
  4. 'Addsomepropertiestoit.  
  5. NewButton.Text=DateTime.Now.ToLongTimeString()  
  6. 'Settheclickeventhandler.  
  7. AddHandlerNewButton.Click,AddressOfNewLink_Click  
  8. 'Placethebuttonontheform.  
  9. lstLinks.Controls.Add(NewButton)  
  10. EndSub  

此代碼在FlowLayoutPanel中創(chuàng)建了一個(gè)按鈕,大多數(shù)情況下這都能正常運(yùn)行,除非事件處理器不按照按鈕所示的進(jìn)行操作。如果你打算服務(wù)多個(gè)控件類型,那么每個(gè)控件類型都需要一個(gè)獨(dú)特的處理。你可以使用多事件處理器或者為某些類型提供選擇標(biāo)準(zhǔn)。

NewLink_Click()事件處理器照常將傳入發(fā)送器轉(zhuǎn)換成指定類型,在這個(gè)示例中則是LinkLabel。該代碼可以訪問LinkLabel屬性并能用其他方式進(jìn)行互動(dòng)。在我們的示例中,只顯示了一個(gè)能在創(chuàng)建鏈接的時(shí)候告知我們的對(duì)話框。

使用動(dòng)態(tài)代碼

在運(yùn)行時(shí)創(chuàng)建一個(gè)控件是在無法確定應(yīng)用程序功能的時(shí)候采取的一種策略。但是動(dòng)態(tài)創(chuàng)建控件并不適用于所有的情況。有些時(shí)候你必須建立可執(zhí)行代碼,雖然你的應(yīng)用程序運(yùn)行的目的是補(bǔ)償不同極其之間的配置,不同用戶的需求,不同的環(huán)境需求或是其他要求。當(dāng)應(yīng)用程序所運(yùn)行的電腦不存在控件,那么通常是需要?jiǎng)?chuàng)建動(dòng)態(tài)代碼的。幸運(yùn)的是,.NET為我們提供了一系列動(dòng)態(tài)代碼選項(xiàng)。例如,你可以創(chuàng)建一個(gè)可執(zhí)行的能獨(dú)立運(yùn)行的程序或是可以想運(yùn)行中的程序加載一個(gè)DLL然后再執(zhí)行。當(dāng)你需要演示一個(gè)外部任務(wù)的時(shí)候可以使用選擇可執(zhí)行,如運(yùn)行一種腳本——該DLL選項(xiàng)最適合擴(kuò)大現(xiàn)有的應(yīng)用程序功能。你可以運(yùn)行來自文件或內(nèi)存的動(dòng)態(tài)代碼。當(dāng)你需要不止一次地運(yùn)行代碼時(shí),可以使用文件。對(duì)代碼的檢查可以再次運(yùn)行外部文件而不需要對(duì)其進(jìn)行二次編譯。當(dāng)你需要多次演示任務(wù)的時(shí)候,如一個(gè)安裝請(qǐng)求,那可以使用內(nèi)存圖像。

當(dāng)然我們也可以更改源代碼。例如,你可以使用字符串來建立需要在應(yīng)用程序中直接使用的代碼。如果你需要代碼具有高度靈活性,且代碼本身不是很長(zhǎng)時(shí),這一方法的優(yōu)勢(shì)就非常顯著。也可以從文件里建立代碼,就如同VS一樣。這一方法最適用于相對(duì)穩(wěn)定且不需要復(fù)雜編碼的需求。第三種選擇是使用DocumentationObjectModel來創(chuàng)建代碼并將其作為CodeDom樹型結(jié)構(gòu)的一個(gè)系列。該樹型結(jié)構(gòu)包括了CodeCormpileUnits。這就像是用DOM模式創(chuàng)建了一個(gè)XML文件。

使用動(dòng)態(tài)創(chuàng)建代碼的最好方式是用示例來檢查一下。例三展示了一個(gè)基本“HelloWorld”示例。該示例用源代碼直接創(chuàng)建了代碼因此你可以看到整個(gè)運(yùn)行以及生成一個(gè)外部可執(zhí)行文件的過程。

VB.NET動(dòng)態(tài)代碼例三:動(dòng)態(tài)編碼示例

  1. PrivateSubbtnTest3_Click()HandlesbtnTest3.Click  
  2. 'Createacompiler.  
  3. DimCompAsVBCodeProvider=NewVBCodeProvider()  
  4. 'Definetheparametersforthecodeyouwanttocompile.  
  5. DimParmsAsCompilerParameters=NewCompilerParameters)  
  6. 'Wedowanttocreateanexecutable,ratherthanaDLL.  
  7. Parms.GenerateExecutable=True 
  8. 'ThecompilerwillcreateanoutputassemblycalledOutput.  
  9. Parms.OutputAssembly="Output" 
  10. 'Thecompilerwon'ttreatwarningsaserrors.  
  11. Parms.TreatWarningsAsErrors=False 
  12. 'Addanyassemblyyouwanttoreference.  
  13. Parms.ReferencedAssemblies.Add("System.Windows.Forms.dll")  
  14. 'Definethecodeyouwanttorun.  
  15. DimSampleCodeAsStringBuilder=NewStringBuilder()  
  16. SampleCode.Append("ImportsSystem.Windows.Forms"+vbCrLf)  
  17. SampleCode.Append("ModuleTestAssembly"+vbCrLf)  
  18. SampleCode.Append("SubMain()"+vbCrLf)  
  19. SampleCode.Append("MessageBox.Show("+Chr(34)+_"DynamicallyCreatedCode!"+_Chr(34)+")"+vbCrLf)  
  20. SampleCode.Append("EndSub"+vbCrLf)  
  21. SampleCode.Append("EndModule"+vbCrLf)'Definethecodetorun.  
  22. DimExecutableAsCompilerResults=_Comp.CompileAssemblyFromSource(Parms,SampleCode.ToString())  
  23. 'Displayerrormessagesifthereareany.  
  24. IfExecutable.Errors.HasErrorsThen  
  25. ForEachItemAsCompilerErrorInExecutable.Errors  
  26. MessageBox.Show(Item.ErrorText)NextElse'Iftherearen'tanyerrormessages,startthe'executable.  
  27. Process.Start("Output")  
  28. EndIf  
  29. EndSub 

一開始你創(chuàng)建了一個(gè)使用VBCodeProvider的編譯器Comp。舊一點(diǎn)的.NET版本使用的是不同的方法但是這里所講的是微軟推薦的一個(gè)新方法。
為了使用編譯器,你必須創(chuàng)建能描述應(yīng)用程序的參數(shù)。這些參數(shù)類似于VS中你創(chuàng)建的參數(shù),只是現(xiàn)在你可以對(duì)它們進(jìn)行定義。該代碼一開始就將GenerateExecutable設(shè)置為True,這意味著你需要的是一個(gè)EXE文件而不是DLL。

Parms.OutputAssembly屬性包含了輸出文件的名稱。你只需要在想創(chuàng)建文件時(shí)提供這一信息即可,而不需要生成可執(zhí)行內(nèi)存了。如果你ixiang生成可執(zhí)行文件的內(nèi)存版本,可以將Parm.GenerateInMemory屬性設(shè)置為True。使用Parm.TreatWarningsAsErrors屬性來確定如何處理警告信息。默認(rèn)的設(shè)置會(huì)使其為錯(cuò)誤,這意味著你的應(yīng)用程序可能無法對(duì)其進(jìn)行編譯。大多數(shù)程序員使用默認(rèn)設(shè)置,盡管他們開發(fā)了程序,但是在開發(fā)完成的程序中卻將其設(shè)置為False。大多數(shù)應(yīng)用程序需要外部DLL以正常運(yùn)行。當(dāng)然,你不能創(chuàng)建任意的沒有引用外部DLL的Windows表單程序。通常,你要使用Reference文件夾來完成這一任務(wù)。不過,當(dāng)你動(dòng)態(tài)創(chuàng)建代碼的時(shí)候可以依賴于Parms.ReferencedAssemblies屬性。如下所示,只需添加你要的DLL即可?,F(xiàn)在,你已經(jīng)定義了項(xiàng)目,接下來需要為其創(chuàng)建源代碼。如前文所述,你可以依賴于一個(gè)外部文件或DOM模式。然后,該示例創(chuàng)建了代碼因此你可以看到整個(gè)過程。下面是代碼的原始形式:

ImportsSystem.Windows.FormsModuleTestAssemblySubMain()MessageBox.Show("DynamicallyCreatedCode!")EndSubEndModule這個(gè)簡(jiǎn)單的例子顯示了一個(gè)對(duì)話框。注意vbCrLf的使用。如果你不使用這一方法,那編譯器會(huì)發(fā)送給你一個(gè)錯(cuò)誤信息。vbCrLf條目在該代碼中所起的作用與在程序代碼中的作用相同,只是添加的方式不一樣。從這一點(diǎn)老說,你最后會(huì)用Comp.CompileAsseblyFromSource()方法編譯代碼。當(dāng)使用DOM模式和文件的時(shí)候可以使用這一方法。而在所有三種情況中,編譯器用參數(shù)和源代碼創(chuàng)建了你請(qǐng)求的輸出。該運(yùn)算的輸出出現(xiàn)在Executable中,是CompilerResults類型。編譯的失敗次數(shù)多于程序員的預(yù)計(jì)。無論你是在哪里使用動(dòng)態(tài)編碼技巧,你必須假設(shè)會(huì)出現(xiàn)失敗的情況以及處理失敗的方案。在本例中,代碼尋找的是錯(cuò)誤并在編譯失敗時(shí)將其展示在了信息框中。否則,代碼會(huì)依賴于Process.Start()方法來啟用可執(zhí)行文件。

底線

動(dòng)態(tài)編碼技巧并不是萬能鑰匙。當(dāng)你為開發(fā)問題找到了好的靜態(tài)解決方案時(shí),當(dāng)然也可以使用。但是在我們所列出的情況中沒有可行的靜態(tài)方案,因此要選擇動(dòng)態(tài)編碼技巧。大多數(shù)情況下,要用動(dòng)態(tài)編碼技巧解決以下問題:
◆用戶的環(huán)境會(huì)以不可預(yù)見的方式更改時(shí);
◆無法控制用戶電腦的安裝;
◆用戶或應(yīng)用程序都添加了你要用控件執(zhí)行的數(shù)據(jù)要素;
◆應(yīng)用程序必須執(zhí)行很早以前的安裝任務(wù),且這些任務(wù)與電腦,環(huán)境,網(wǎng)絡(luò)或其他不確定因素聯(lián)系緊密時(shí);
◆應(yīng)用程序要執(zhí)行了處理級(jí)別的任務(wù),且這些任務(wù)取決于機(jī)器連接或其他狀況。

顯然,還有其他一些情況能使用動(dòng)態(tài)編碼技巧。最重要的是記住但凡有不可預(yù)知的情況下要考慮使用動(dòng)態(tài)編碼技巧。通常在編碼環(huán)境中出現(xiàn)了靜態(tài)代碼無法處理的情況時(shí),我們就可以使用動(dòng)態(tài)編碼技巧。

【編輯推薦】

  1. 實(shí)例講述VB.NET使用Log4Net
  2. 三分鐘學(xué)會(huì)VB.NET轉(zhuǎn)換形態(tài)
  3. VB.NET獲取硬盤信息四大法寶
  4. 講述VB.NET調(diào)用Excel的好處
  5. 簡(jiǎn)單例子概述VB.NET新窗體
責(zé)任編輯:田樹 來源: qqread
相關(guān)推薦

2009-10-23 16:53:16

VB.NET語法規(guī)則

2009-11-10 12:12:57

VB.NET函數(shù)

2009-10-27 13:05:37

VB.NET對(duì)象列表

2009-10-12 15:41:09

VB.NET動(dòng)態(tài)代碼

2009-10-23 17:40:24

VB.NET繪圖方法

2009-11-02 10:53:34

VB.NET INI文

2009-10-29 14:02:24

VB和VB.NET比較

2009-11-03 10:18:46

VB.NET繼承

2009-10-29 16:19:58

VB.NET文件操作

2009-11-02 16:55:50

VB.NET Smar

2010-01-13 18:09:09

VB.NET動(dòng)態(tài)生成代

2009-06-12 19:12:24

動(dòng)態(tài)代碼VB.NET

2009-10-29 14:50:22

VB.NET擴(kuò)展名分組

2009-11-02 17:12:01

VB和VB.NET

2012-05-09 09:49:57

移動(dòng)支付

2009-11-03 13:16:58

VB.NET讀取文件

2009-10-28 10:04:53

VB.NET XmlW

2009-10-27 10:58:00

VB.NET文件名排序

2009-10-12 15:02:51

VB.NET動(dòng)態(tài)控件

2009-10-12 15:44:26

VB.NET動(dòng)態(tài)編碼技
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)