控件數組是位於一個窗體上共享同一名稱的一組同種類型控件。普通控件僅使用名稱就可以識別,而引用控件數組中的成員則需要同時使用名稱和索引。開發人員在 Visual Basic 6.0 以及更早的版本中使用控件數組主要有以下三個理由:
1. 在循環中訪問數組中控件的屬性。
2. 向窗體動態添加新控件。
3. 允許一個事件例程與多個控件連接 。
控件數組的使用,極大的方便了開發人員。然而,剛剛從Visual Basic6.0(以下簡稱VB6.0)過渡到Visual Basic.Net(以下簡稱VB.NET)的初學者卻發現,在VB.NET中似乎不能使用控件數組了。筆者仔細查閱了VB.NET的MSDN文檔發現,在 VB.NET 中,確實不再支持控件數組。原因是,VB.NET對事件模型作了很大的改動,引入了另外一種數據類型――控件集合模型,使控件數組沒有存在的必要。就像 VB6.0 中的控件數組可以共享事件一樣,VB.NET 中的事件模型允許任何事件處理程序都可以處理來自多個控件的事件,這就允許創建屬於不同類型但共享相同事件的控件組。
所謂控件集合是指包含在一個容器中的所有控件的總和,能夠創建控件集合的容器有:Form、Panel、GropBox等。程序運行時,可以通過訪問容器的Control屬性來得到該容器中的所有控件。
下面將演示如何通過控件集合來使用控件數組:
一、 直接使用Form容器的控件集合來使用控件數組:
建立一個VB.NET項目,在Form1中添加三個TextBox控件,名稱分別為:TextBox1、TextBox2、TextBox3,一個Button控件。
雙擊Button,輸入如下代碼:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ‘下面的語句是通過數組元素的下標來訪問Form中的每一個元素。 Me.Controls.Item(0).Text = "集合中的第一個元素" Me.Controls.Item(1).Text = "集合中的第二個元素" Me.Controls.Item(2).Text = "集合中的第三個元素" Me.Controls.Item(3).Text = "集合中的第四個元素" End Sub
運行項目后,點擊Button,看到的結果是:Form1中的所有控件(包括Button自己)的Text屬性都被修改了,同時還發現,最后加入的的控件變成了集合中的第一個元素(下標為0)。這個結果說明:
Form1中的所有控件已經自動構成了一個控件集合(控件數組),這個特點使得建立控件數組變得非常簡單。
在訪問這些控件時,除了可以通過控件名稱直接訪問外,還可以通過Contro.Item(n)屬性按下標訪問集合中的每一個控件;
集合中控件的類型可以不相同,這點和VB6.0完全不同;
集合中的下標順序是按照加入控件的順序倒排的;
VB.NET中控件數組的特點讓人稍感不適的是,控件數組的下標是按加入順序的倒排續產生的,但程序員完全可以改變這個順序:在代碼編輯窗中點擊“#Region " Windows 窗體設計器生成的代碼”旁邊的“+”號,代碼展開后,找到如下代碼:
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.TextBox3)
Me.Controls.Add(Me.TextBox2)
Me.Controls.Add(Me.TextBox1)
這個代碼順序就是控件數組的下標順序,只要改變這個順序就可以改變控件數組中每個以元素的下標。
在Form中構成控件數組非常方便,但也有一個小問題:一般來說,Form中的控件往往有很多種,系統建立控件集合的時候將會把其中的所有控件放在同一個集合中,這樣一來,程序員在寫代碼的時候有可能將每一個控件的下標混淆,為了解決這個問題,可以用Panel容器來根據需要將某類控件建立成控件數組,也就避免了上述問題。
建立的方法非常簡單:只需要在Form中添加一個Panel控件,然后將需要建立控件數組的控件加入其中即可,然后用:Panel.Control.Item(n)來訪問其中的每一個控件。
二、 用代碼建立控件集合。
建立一個VB.NET項目,在Form中添加三個TextBox和一個Button控件,在代碼編輯窗口中輸入如下代碼:
Dim TextboxArray As New ArrayList ‘定義一個數組例表 Private Sub BiuldTextBoxArray() ‘過程用來將Form上的三個TextBox加入到數組例表中 TextboxArray.Add(TextBox1) TextboxArray.Add(TextBox2) TextboxArray.Add(TextBox3) End Sub
‘讓Form在啟動的時候將三個TextBox控件加入到數組例表中,構成控件數組。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load BiuldTextBoxArray() End Sub
‘編寫Button點擊事件代碼,利用控件數組訪問三個TextBox控件
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextboxArray(0).text = "文本框第一個元素" TextboxArray(1).text = "文本框第二個元素" TextboxArray(2).text = "文本框第三個元素" End Sub
運行工程,點擊Button,發現三個TextBox都被修改了,效果和前面的方法一樣。
三、 在程序中動態添加控件數組。
前面定義的控件數組都是在設計階段完成的,它要求,控件數組中的控件數量必須已知,也叫靜態控件數組;但很多時候要求,控件數組中的控件數量要用程序的某些運行情況來確定,這就要求,控件數組中的控件要能實現動態添加。
建立一個VB.NET工程,在Form上添加兩個Button,其中,Button1用來添加動態控件數組;Button2用來修改數組中每個控件的屬性。
在代碼編輯窗口中輸入如下代碼:
Dim List As New ArrayList ‘定義一個例表對象,用來集合數組控件 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer For i = 0 To 4 ‘利用循環語句動態加入控件數組。 Dim FirstTextBox As New TextBox ‘定義文本框對象 Me.Controls.Add(FirstTextBox) ‘將一個文本框控件加入到Form上 List.Add(FirstTextBox) ‘將文本框控件加入到例表集合中 List.Item(i).top = i * List.Item(i).height + 20 ‘修改新加入控件在Form上的位置 List.Item(i).left = 100 FirstTextBox.TabIndex = i ‘修改新加入控件的TabIndex值 List.Item(i).text = "TextBox" & i.ToString ‘修改默認文本。 Next End Sub
用循環來訪問動態控件數組中的控件。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim i As Integer For i = 0 To 4 List.Item(i).text = "第 " & i.ToString & " 個元素" Next End Sub
運行項目,先點擊Button1,Form上將出現5個文本框,然后再點擊Button2,修改這五個文本框的Text屬性。
從這個實例看出,VB.NET中動態加入控件數組與在VB6.0中實現動態數組有一個顯著的不同:VB6.0中必須要有一個靜態的“控件種子”,而在VB.NET中已經不需要了。
四、 控件數組的事件響應。
控件數組的最重要的特色之一就是讓一組控件響應同一個事件,在事件例程中接收控件具體某控件的Index值來分別處理處理具體問題,這點已經在VB6.0中表現得淋漓盡致了,它在VB.NET中同樣可以實現,只不過實現方式有了變化。由於在容器中的每一個控件只要不作特殊處理,都會自動構成了控件集合,這樣,只要對原有的事件例程作少量修改,就可以非常方便的實現用一個事件例程響應某個集合中所有控件產生的事件。
下面演示實現用同一個例程來處理兩個Button和一個TextBox發出的Click事件。
建立一個VB.NET項目,在Form上添加兩個Button,和一個TextBox。
在代碼編輯窗口中點擊“#Region " Windows 窗體設計器生成的代碼”旁邊的“+”號,代碼展開后,找到如下代碼並調整為下面的順序:
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.Button2)
輸入如下代碼:
Private Sub mControl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, TextBox1.Click Select Case sender.tabindex Case 0 MessageBox.Show("你點擊了 Button1 按鈕") Case 1 MessageBox.Show("你點擊了 Button2 按鈕") Case 2 MessageBox.Show("你點擊了 TextBox1 按鈕") End Select End Sub
在這段 代碼中:Private Sub mControl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, TextBox1.Click 是一個自定義事件,在Handles后面的語句表示:該例程將響應Button1, Button2, TextBox1控件發出的Click事件,如果還有其他控件,也可以放在后面,每一個控件名稱用“,”號隔開。
運行項目,分別點擊Form上面的三個控件就能體會到它的用法。
====================
vb.net里面的動態控件數組的問題,這個動態控件數組在vb里面easy到極致,可是在vb.net里面卻有點讓人摸不着頭腦。
其實也很簡單,因為vb.net和vb不同拉,來看看vb.net的動態控件數組如何實現。
1、在form的頭部定義一個公共的ArrayList類型的變量
Dim m_items As New ArrayList
2、在程序中動態生成控件
while (a<b)
dim lblControl as Label= new Label
lblControl .Text="你好"
lblControl .dock=......top
lblControl .autosize=false.
....
me.controls.add(lblControl )'把動態產生的控件放到對應的區域
'下面這個地方注意拉,
m_items.Add(lblControl )'把這個label放到前面第一步定義的ArrayList中去
AddHandler label.Click, AddressOf LblControlArrayClick '給這組動態控件定義click事件的觸發函數LblControlArrayClick 。
end while
3、定義LblControlArrayClick 的click事件的觸發函數,這個是和vb不同的地方的關鍵所在拉。
'控件數組事件
Private Sub LblControlArrayClick (ByVal sender As Object, ByVal e As EventArgs) Dim lblText As String lblText = CType(sender, Label).Text '這里CType就是將觸發事件的對象還原為Label對象, '有點像java里面的集合阿,放進去后再取出來的時候,要造型一下。 msgbox ("所電擊的動態控件的文字是:" & lblText) end sub
好啦,就是這么簡單,vb.net中的控件數組。
如果你要為控件數組定義其他的觸發事件,只要修改對應的觸發就可以了。