原理分析VB.NET開(kāi)發(fā)控件
經(jīng)過(guò)長(zhǎng)時(shí)間學(xué)習(xí)VB.NET開(kāi)發(fā)控件,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。Microsoft®VB®的組件支持歷來(lái)都是它的一大賣(mài)點(diǎn),于是第三方軟件開(kāi)發(fā)商們紛紛開(kāi)發(fā)出各種具有新功能性的可視控件(也有少數(shù)非可視控件)供VB程序員選用。這種特殊的VB開(kāi)發(fā)形式創(chuàng)造了無(wú)數(shù)的第三方控件——有的是共享軟件/自由軟件,有的則被放到柜臺(tái)上銷(xiāo)售。現(xiàn)在,人們甚至可以直接用VB.NET開(kāi)發(fā)控件,自己的可視/非可視組件了。于是,組件的數(shù)量迅速增長(zhǎng),其中相當(dāng)一部分都是程序員(或者開(kāi)發(fā)小組)為針對(duì)自己的開(kāi)發(fā)任務(wù)設(shè)計(jì)的。
注意你或你的開(kāi)發(fā)小組過(guò)去購(gòu)買(mǎi)的MicrosoftActiveX控件往往無(wú)須修改或重寫(xiě)就能直接移植到微軟.NET環(huán)境下。具體而言,只要進(jìn)入MicrosoftVisualStudio®.NET的IDE(集成開(kāi)發(fā)環(huán)境)環(huán)境,依次從菜單中選擇:工具Tool->自定義工具箱CustomizeToolbox),或者使用.NET框架實(shí)用程序Aximp.exe(ActiveX控件導(dǎo)入程序),就能讓.NET應(yīng)用程序中調(diào)用現(xiàn)成的ActiveX控件了??墒?,一旦某個(gè)控件在.NET環(huán)境下工作不正常,它的作者恐怕就應(yīng)該考慮升級(jí)該控件了。所以,為了能在.NET環(huán)境中正常使用購(gòu)來(lái)的第三方ActiveX控件,就應(yīng)該到開(kāi)發(fā)商的Web網(wǎng)站去看看它有沒(méi)有出升級(jí)版或者.NET版。在.NET編程世界里,人們對(duì)自定義UI組件的需求依然存在,只不過(guò)它們的創(chuàng)建過(guò)程有所不同。
為什么要VB.NET開(kāi)發(fā)控件?
為了限制Windows窗體TextBox控件的文本類(lèi)型,可以在窗體代碼中添加該控件的KeyPress事件處理程序,以攔截用戶(hù)的每次擊鍵并檢查該鍵對(duì)應(yīng)的字符能否進(jìn)入TextBox:
- Private Sub TextBox1_KeyPress(ByVal sender As Object, _ ByVal e
As System.Windows.Forms.KeyPressEventArgs) _ Handles TextBox1.KeyPress- If Not Char.IsDigit(e.KeyChar) Then
- e.Handled = True
- Else
- e.Handled = False
- End If
- End Sub
注意單純依靠捕捉擊鍵事件是無(wú)法確保輸入TextBox的文本全是數(shù)字的,因?yàn)橛脩?hù)有時(shí)不是直接向TextBox中敲入字符,而是通過(guò)剪貼板粘貼字符給TextBox;何況TextBox文本的初值就有可能包含非法的字符。某些其它事件比如TextChanged等,或許能夠捕捉到更多非法輸入,但我更喜歡用Validating或者Leave事件,它們是在用戶(hù)離開(kāi)輸入控件之后才對(duì)TextBox進(jìn)行字符合法性檢查。這么做誠(chéng)然放棄了對(duì)用戶(hù)輸入的即時(shí)反應(yīng),卻允許用戶(hù)首先通過(guò)剪貼板輸入“輕度犯規(guī)”的文本字符串,比如在禁止空格的輸入框中粘貼“3425234323422342”,然后手工糾正輸入框里的“犯規(guī)”字符。
向控件中手工添加事件處理程序代碼并不太難,可是當(dāng)你面臨更復(fù)雜的編程任務(wù),比如檢驗(yàn)郵寄地址或者汽車(chē)的VIN#(車(chē)輛識(shí)別號(hào)碼)的字符合法性時(shí),你還會(huì)感到如此輕松嗎?此時(shí)你會(huì)希望把同一段事件處理程序用于多個(gè)窗體甚至多個(gè)項(xiàng)目,或者將它提供給開(kāi)發(fā)小組的其他成員共享。然而,提取窗體中的代碼片段,連同安裝指南和控件的命名規(guī)則一起發(fā)布,卻是一個(gè)惡夢(mèng)的開(kāi)端。好在天無(wú)絕人之路,你只要把它連同一個(gè)自定義控件發(fā)布,就不會(huì)遭遇這種惡夢(mèng)了,因?yàn)榇藭r(shí)用戶(hù)界面和相關(guān)代碼都位于獨(dú)立的組件中,而組件的發(fā)布相對(duì)要容易得多。通過(guò)組件發(fā)布的代碼片段在升級(jí)上也方便些:你只需發(fā)布新版的組件即可,再也不必通過(guò)種種渠道公布新的代碼片段讓程序員手工覆蓋原先的代碼了!
【編輯推薦】