這篇文章將為大家詳細(xì)講解有關(guān)VB.NET如何開(kāi)發(fā)控件,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),金昌企業(yè)網(wǎng)站建設(shè),金昌品牌網(wǎng)站建設(shè),網(wǎng)站定制,金昌網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,金昌網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
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)售?,F(xiàn)在,人們甚至可以直接用 VB 開(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)的 Microsoft ActiveX 控件往往無(wú)須修改或重寫(xiě)就能直接移植到微軟 .NET 環(huán)境下。具體而言,只要進(jìn)入 Microsoft Visual Studio® .NET 的 IDE (集成開(kāi)發(fā)環(huán)境) 環(huán)境,依次從菜單中選擇:工具 Tool -> 自定義工具箱 Customize Toolbox) ,或者使用 .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ò)程有所不同。本文將探討兩個(gè)問(wèn)題:為什么要?jiǎng)?chuàng)建自己的 Microsoft Windows® 控件?在 VB.NET開(kāi)發(fā)控件時(shí)有哪些方面不同于以往的 5.0 / 6.0 版?
為什么要開(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 = Tru 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ī)”的文本字符串 ,比如在禁止空格的輸入框中粘貼 “3425 2343 2342 2342”,然后手工糾正輸入框里的“犯規(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ò)種種渠道公布新的代碼片段讓程序員手工覆蓋原先的代碼了!
繼承性如何改變了控件的開(kāi)發(fā)?
在VB.NET開(kāi)發(fā)控件已經(jīng)和 VB6.0大相徑庭。其根本原因,就是 .NET 引入了繼承性。在 VB6.0中,你只能不用控件或者直接引用現(xiàn)成的控件來(lái)實(shí)現(xiàn)各種功能性。例如:為了創(chuàng)建前面提到的自定義文本輸入框,你就要新建一個(gè) ActiveX 控件,然后向其中增加一個(gè) TextBox 。
注意 人們通常把這種編程思路稱(chēng)為“容器” (containment) 或者“委托” (delegation)。在 VB6.0中,用于模擬繼承機(jī)制的非控件類(lèi)也可以采用這種思路。
此時(shí),新建的 ActiveX 控件并不會(huì)如你所愿自動(dòng)獲得 TextBox 的某些屬性 (比如 Text 屬性);這些屬性只能由你編碼實(shí)現(xiàn)。更糟的是,你必須用許多代碼來(lái)確保 TextBox 始終占據(jù)整個(gè)窗體;你還得為新控件設(shè)計(jì) resizing 事件處理程序。當(dāng)然,經(jīng)過(guò)一番折騰,你總會(huì)完成該控件的設(shè)計(jì)任務(wù)的,何況還有 ActiveX 控件界面向?qū)軠p輕你的負(fù)擔(dān)。可是在 .NET 環(huán)境下,整個(gè)任務(wù)的完成思路都會(huì)變得完全不同。
VB6.0提供了一個(gè)附加程序 (add-in) ,它能自動(dòng)添加和映射控件屬性,以簡(jiǎn)化控件的開(kāi)發(fā)。
繼承性能避免控件開(kāi)發(fā)中的某些重復(fù)代碼,因?yàn)樗茏?.NET 控件直接獲得任何其它控件的功能性。例如:為了創(chuàng)建自己的 TextBox 控件,你可以繼承現(xiàn)有的 TextBox 控件,而不是 UserControl 控件。新控件繼承了基類(lèi)控件的全部功能性,因此你只需要對(duì)基類(lèi)控件中沒(méi)有的功能性編碼即可。下面舉一個(gè)實(shí)際的例子。以下代碼能夠創(chuàng)建一個(gè)自定義 TextBox 控件,它只允許用戶(hù)輸入數(shù)字字符:
注意 為了運(yùn)行這段代碼,你只需在“Windows 應(yīng)用程序”模板下新建一個(gè) VB .NET 項(xiàng)目,然后就能在 IDE 自動(dòng)生成的空白窗體中試驗(yàn)新控件了。在項(xiàng)目中新建一個(gè)類(lèi) NumericTextBox ,用下面的代碼替換 NumericTextBox 類(lèi)文件的內(nèi)容,編譯該項(xiàng)目。***,在菜單中選擇工具->自定義工具箱,選中先前編譯項(xiàng)目得到的 .exe 文件,就能把新控件添加到工具箱了。
Public Class NumericTextBox Inherits System.Windows.Forms.TextBox Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs) If Not Char.IsDigit(e.KeyChar) Then e.Handled = True Els e.Handled = False End If End Sub End Class
對(duì)本例來(lái)說(shuō),以上代碼已經(jīng)足夠了。如果你還覺(jué)得它不夠完善的話(huà),請(qǐng)改用下列代碼,它運(yùn)用一種奇妙的布爾邏輯減少了代碼行數(shù):
Public Class NumericTextBox Inherits System.Windows.Forms.TextBox Protected Overrides Sub OnKeyPress(ByVal e As _ System.Windows.Forms.KeyPressEventArgs) e.Handled = Not Char.IsDigit(e.KeyChar) End Sub End Class
現(xiàn)在,你的新控件已經(jīng)正確顯示在窗體中了。它象 TextBox 一樣處理事件,并且擁有與 TextBox 一樣的方法、屬性。你甚至不需更多的編碼就能實(shí)現(xiàn)對(duì)新控件的數(shù)據(jù)綁定,因?yàn)檫@也是基類(lèi)控件 TextBox 的功能性之一。
注意 本控件對(duì)用戶(hù)輸入的要求十分苛刻:它只允許輸入 0 至 9 的數(shù)字,也就是說(shuō),數(shù)字中的逗號(hào)、小數(shù)點(diǎn)甚至負(fù)號(hào)都是非法字符。我將在下一篇文章中介紹一個(gè)功能更強(qiáng)的輸入驗(yàn)證程序。
在VB.NET開(kāi)發(fā)控件時(shí),核心代碼會(huì)和本范例一樣長(zhǎng),可是用于處理控件的 resizing 事件和實(shí)現(xiàn) TextBox 組件屬性的代碼也會(huì)有這么長(zhǎng)。由此可見(jiàn),.NET 提供的繼承性能夠大大精簡(jiǎn)源代碼。單憑這一點(diǎn),.NET 就已經(jīng)令人嘆服了,何況它還有許多其它優(yōu)越性。更奇妙的是,凡是要求使用某一控件的地方,都能改用繼承該控件而來(lái)的新控件。例如:在任何例程中要求 TextBox 的地方都能用你的 NumericTextBox 控件。不僅如此,從現(xiàn)有控件,而不是從 UserControl 類(lèi)繼承而來(lái)的新控件,不但具備基類(lèi)控件的所有功能性,還能象基類(lèi)控件一樣使用繼承得到的屬性、方法和事件。因此,任何程序員只要學(xué)過(guò)標(biāo)準(zhǔn)的 TextBox 控件,就知道如何使用 NumericTextBox 控件。允許繼承現(xiàn)有的類(lèi)/控件,是從VB6.0到 .NET 的一個(gè)重大飛躍,可是 .NET 的優(yōu)點(diǎn)又何止于此!只要你認(rèn)真學(xué)習(xí)本系列文章所提供的范例,你就會(huì)發(fā)現(xiàn),在 .NET 環(huán)境下Windows 窗體控件不但擁有不少?gòu)?qiáng)大的功能,而且它們的創(chuàng)建也比在老版本 VB 中容易得多。
關(guān)于“VB.NET如何開(kāi)發(fā)控件”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
分享名稱(chēng):VB.NET如何開(kāi)發(fā)控件
網(wǎng)頁(yè)網(wǎng)址:http://chinadenli.net/article14/giisge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、用戶(hù)體驗(yàn)、手機(jī)網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站設(shè)計(jì)公司、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)