首先创建一个Button类型控件数组:
1、创建“Windows应用程序”类型的工程,添加名为ButtonArray的类,并使该类继承 System.Collection.CollectionBase 类。System.Collections.CollectionBase类是.NET框架类库中为集合操作提供抽象的基类,通过对它的继承可以为我们的ButtonArray类具备集合增加、删除、索引的功能。
2、为ButtonArray类添加ParentForm属性,即控件组所在窗体,创建初始化函数(构造函数);
3、为控件数组类增加AddItem方法,该方法在控件数组类中添加成员;
4、为控件数组类增加RemoveItem方法,该方法在控件数组中删除一个成员。
示例代码:
Public Class ButtonArray
Inherits System.Collections.CollectionBase
Private ReadOnly ParentForm As System.Windows.Forms.Form
Public Sub New(ByVal pForm As System.Windows.Forms.Form)
ParentForm = pForm
End Sub
Default Public ReadOnly Property Item(ByVal index As Integer) As System.Windows.Forms.Button
Get
Return Me.List.Item(index) ' ButtonArray的List 属性从CollectionBase 继承
End Get
End Property
Public Sub AddItem()
Dim btnItem As New System.Windows.Forms.Button
Me.List.Add(btnItem)
ParentForm.Controls.Add(btnItem) '向窗体中增加控件
btnItem.Tag = Me.Count 'Count属性从CollectionBase 继承
btnItem.Top = Me.Count * 30
btnItem.Left = 200
btnItem.Text = "Button" & Me.Count.ToString
AddHandler btnItem.Click, AddressOf btnItem_Click '绑定事件处理程序
End Sub
Public Sub AddItem(ByVal btnItem As System.Windows.Forms.Button)
Me.List.Add(btnItem)
AddHandler btnItem.Click, AddressOf btnItem_Click '绑定事件处理程序
End Sub
Public Sub RemoveItem()
If Me.Count > 0 Then
ParentForm.Controls.Remove(Me(Me.Count - 1))
Me.List.RemoveAt(Me.Count - 1)
End If
End Sub
Public Sub btnItem_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'在这里编写控件数组对点击事件的响应
'例如:
MsgBox("点击:" & sender.GetType().ToString & CType(CType(sender, Button).Tag, String))
End Sub
End Class
使用创建的控件数组
在Form1中放置两个按钮Button1、Button2,分别测试控件数组的增添、删除。
双击Form添加代码:
Public Class Form1
Inherits System.Windows.Forms.Form
……Windows窗体设计器生成的代码……
Dim Buttons As New ButtonArray(Me)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Buttons.AddItem()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Buttons.RemoveItem()
End Sub
End Class
其他的控件数组也可以用类似的方式来实现
例如 Label控件数组
LabelArray.vb代码如下:
Public Class LabelArray
Inherits System.Collections.CollectionBase
Private ReadOnly ParentForm As System.Windows.Forms.Form
Public Sub New(ByVal pForm As System.Windows.Forms.Form)
ParentForm = pForm
End Sub
Default Public ReadOnly Property Item(ByVal index As Integer) As System.Windows.Forms.Label
Get
Return Me.List.Item(index) ' ButtonArray的List 属性从CollectionBase 继承
End Get
End Property
Public Sub AddItem(ByVal btnItem As System.Windows.Forms.Label)
Me.List.Add(btnItem)
AddHandler btnItem.Click, AddressOf btnItem_Click '绑定事件处理程序
End Sub
Public Sub btnItem_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'在这里编写控件数组对点击事件的响应
'例如:
MsgBox("点击:" & sender.GetType().ToString & CType(CType(sender, Label).Tag, String))
End Sub
End Class
使用创建的Label控件
在Form1中放置两个按钮Label1、Label2
双击Form添加代码:
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
'用来绑定label
BindArray()
End Sub
……Windows窗体设计器生成的其他代码……
#End Region
Dim Labels As New LabelArray(Me)
Public Sub BindArray()
Me.Label1.Tag = "1111"
Me.Label2.Tag = "222"
Labels.AddItem(Me.Label1)
Labels.AddItem(Me.Label2)
End Sub
End Class
然后可以测试点击两个label可以显示相应的Tag的信息。
11111111111111111111111111111111111111111
在VB.NET中使用控件数组
控件数组是位于一个窗体上共享同一名称的一组同种类型控件。普通控件仅使用名称就可以识别,而引用控件数组中的成员则需要同时使用名称和索引。开发人员在 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上面的三个控件就能体会到它的用法。