VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > VBnet >
  • vb.net教程之使用VB.NET開發自定義Windows控件

  • 2017-06-07 11:52 來源:未知
王凌峰 編譯 

前言 
Microsoft® Visual Basic® 的組件支持歷來都是它的一大賣點,于是第三方軟件開發商們紛紛開發出各種具有新功能性的可視控件 (也有少數非可視控件) 供 Visual Basic 程序員選用。這種特殊的 Visual Basic 開發形式創造了無數的第三方控件——有的是共享軟件/自由軟件,有的則被放到柜臺上銷售。現在,人們甚至可以直接用 Visual Basic 開發自己的可視/非可視組件了。于是,組件的數量迅速增長,其中相當一部分都是程序員 (或者開發小組) 為針對自己的開發任務設計的。 
注意 你或你的開發小組過去購買的 Microsoft ActiveX 控件往往無須修改或重寫就能直接移植到微軟 .NET 環境下。具體而言,只要進入 Microsoft Visual Studio® .NET 的 IDE (集成開發環境) 環境,依次從菜單中選擇:工具 Tool -> 自定義工具箱 Customize Toolbox) ,或者使用 .NET 框架實用程序 Aximp.exe (ActiveX 控件導入程序) ,就能讓 .NET 應用程序中調用現成的 ActiveX 控件了??墑?,一旦某個控件在 .NET 環境下工作不正常,它的作者恐怕就應該考慮升級該控件了。所以,為了能在 .NET 環境中正常使用購來的第三方 ActiveX 控件,就應該到開發商的 Web 網站去看看它有沒有出升級版或者 .NET 版。 
在 .NET 編程世界里,人們對自定義 UI 組件的需求依然存在,只不過它們的創建過程有所不同。本文將探討兩個問題:為什么要創建自己的 Microsoft Windows® 控件?在 Visual Basic .NET 中開發控件時有哪些方面不同于以往的 5.0 / 6.0 版?  
為什么要開發你自己的控件? 
為了限制 Windows 窗體TextBox 控件的文本類型,可以在窗體代碼中添加該控件的KeyPress 事件處理程序,以攔截用戶的每次擊鍵并檢查該鍵對應的字符能否進入 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 
注意 單純依靠捕捉擊鍵事件是無法確保輸入 TextBox 的文本全是數字的,因為用戶有時不是直接向 TextBox 中敲入字符,而是通過剪貼板粘貼字符給 TextBox ;何況 TextBox 文本的初值就有可能包含非法的字符。某些其它事件比如 TextChanged 等,或許能夠捕捉到更多非法輸入,但我更喜歡用 Validating 或者 Leave 事件,它們是在用戶離開輸入控件之后才對 TextBox 進行字符合法性檢查。這么做誠然放棄了對用戶輸入的即時反應,卻允許用戶首先通過剪貼板輸入“輕度犯規”的文本字符串 ,比如在禁止空格的輸入框中粘貼 “3425 2343 2342 2342”,然后手工糾正輸入框里的“犯規”字符。 
向控件中手工添加事件處理程序代碼并不太難,可是當你面臨更復雜的編程任務,比如檢驗郵寄地址或者汽車的 VIN # (車輛識別號碼) 的字符合法性時,你還會感到如此輕松嗎?此時你會希望把同一段事件處理程序用于多個窗體甚至多個項目,或者將它提供給開發小組的其他成員共享。然而,提取窗體中的代碼片段,連同安裝指南和控件的命名規則一起發布,卻是一個惡夢的開端。好在天無絕人之路,你只要把它連同一個自定義控件發布,就不會遭遇這種惡夢了,因為此時用戶界面和相關代碼都位于獨立的組件中,而組件的發布相對要容易得多。通過組件發布的代碼片段在升級上也方便些:你只需發布新版的組件即可,再也不必通過種種渠道公布新的代碼片段讓程序員手工覆蓋原先的代碼了! 
繼承性如何改變了控件的開發? 
在 .NET 中的控件開發已經和 Visual Basic 6.0 大相徑庭。其根本原因,就是 .NET 引入了繼承性。在 Visual Basic 6.0 中,你只能不用控件或者直接引用現成的控件來實現各種功能性。例如:為了創建前面提到的自定義文本輸入框,你就要新建一個 ActiveX 控件,然后向其中增加一個 TextBox 。 
注意 人們通常把這種編程思路稱為“容器” (containment) 或者“委托” (delegation)。在 Visual Basic 6.0 中,用于模擬繼承機制的非控件類也可以采用這種思路。 
此時,新建的 ActiveX 控件并不會如你所愿自動獲得 TextBox 的某些屬性 (比如 Text 屬性);這些屬性只能由你編碼實現。更糟的是,你必須用許多代碼來確保 TextBox 始終占據整個窗體;你還得為新控件設計 resizing 事件處理程序。當然,經過一番折騰,你總會完成該控件的設計任務的,何況還有 ActiveX 控件界面向導 ( Visual Basic 6.0 附加程序之一,如圖 1 所示) 能減輕你的負擔??墑竊?.NET 環境下,整個任務的完成思路都會變得完全不同。 


圖 1. Visual Basic 6.0 提供了一個附加程序 (add-in) ,它能自動添加和映射控件屬性,以簡化控件的開發。 
繼承性能避免控件開發中的某些重復代碼,因為它能讓 .NET 控件直接獲得任何其它控件的功能性。例如:為了創建自己的 TextBox 控件,你可以繼承現有的 TextBox 控件,而不是 UserControl 控件。新控件繼承了基類控件的全部功能性,因此你只需要對基類控件中沒有的功能性編碼即可。下面舉一個實際的例子。以下代碼能夠創建一個自定義 TextBox 控件,它只允許用戶輸入數字字符: 
注意 為了運行這段代碼,你只需在“Windows 應用程序”模板下新建一個 Visual Basic .NET 項目,然后就能在 IDE 自動生成的空白窗體中試驗新控件了。在項目中新建一個類 NumericTextBox ,用下面的代碼替換 NumericTextBox 類文件的內容,編譯該項目。最后,在菜單中選擇工具->自定義工具箱,選中先前編譯項目得到的 .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 
Else 
e.Handled = False 
End If 
End Sub 
End Class 
對本例來說,以上代碼已經足夠了。如果你還覺得它不夠完善的話,請改用下列代碼,它運用一種奇妙的布爾邏輯減少了代碼行數: 
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 
現在,你的新控件已經正確顯示在窗體中了。它象 TextBox 一樣處理事件,并且擁有與 TextBox 一樣的方法、屬性。你甚至不需更多的編碼就能實現對新控件的數據綁定,因為這也是基類控件 TextBox 的功能性之一。 
注意 本控件對用戶輸入的要求十分苛刻:它只允許輸入 0 至 9 的數字,也就是說,數字中的逗號、小數點甚至負號都是非法字符。我將在下一篇文章中介紹一個功能更強的輸入驗證程序。 
在 Visual Basic 6.0 中設計本控件時,核心代碼會和本范例一樣長,可是用于處理控件的 resizing 事件和實現 TextBox 組件屬性的代碼也會有這么長。由此可見,.NET 提供的繼承性能夠大大精簡源代碼。單憑這一點,.NET 就已經令人嘆服了,何況它還有許多其它優越性。更奇妙的是,凡是要求使用某一控件的地方,都能改用繼承該控件而來的新控件。例如:在任何例程中要求 TextBox 的地方都能用你的 NumericTextBox 控件。不僅如此,從現有控件,而不是從 UserControl 類繼承而來的新控件,不但具備基類控件的所有功能性,還能象基類控件一樣使用繼承得到的屬性、方法和事件。因此,任何程序員只要學過標準的 TextBox 控件,就知道如何使用 NumericTextBox 控件。允許繼承現有的類/控件,是從Visual Basic 6.0 到 .NET 的一個重大飛躍,可是 .NET 的優點又何止于此!只要你認真學習本系列文章所提供的范例,你就會發現,在 .NET 環境下Windows 窗體控件不但擁有不少強大的功能,而且它們的創建也比在老版本 Visual Basic 中容易得多。 
總結 
無論對于個人、開發小組,還是軟件開發商,自定義控件的開發都是功能最強大的組件技術之一。眾所周知,把用戶界面與功能性以軟件包的形式進行發布,始終是Visual Basic 等可視化開發工具立于不敗之地的重要因素;在新版的可視化工具里仍然延續著該理念。到了 .NET 時代,控件的開發思路已經大不相同了,比如:它引入了繼承等新特性。好在這些新特性都是對程序員有利的,因為它們有效地減少了人們的編碼負擔,進而簡化了自定義控件的創建過程。本文以若干控件為例向讀者介紹了自定義控件的創建過程,以及控件開發中的某些重要技術。當然,我還希望讀者能從這些范例中學會如何創建自己的新控件。 

本欄文章均來自于互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用于商業或者其他目的。

相關教程