实现一个控件数组是Visual Basic 6程序员用来削减代码和应用程序复杂性的最常用的方法之一。通用的事件处理函数处理与控件相关的事件。
那些现在使用Visual Basic.NET的程序员发现控件数组(以及类似的东西)已经不再支持了。你还会发现,当你使用转换向导将一个Visual Basic应用程序转换到Visual Basic.NET中来的时候,Visual Basic .NET使用一个兼容的接口来模拟控件数组。但是据说这些兼容的接口不会一直被支持(但是至少下个星期还是支持的)。我想使用“原始”的技术实现“控件数组”更好。
实际上有一种简单的方法让一个事件处理函数来应付许多操作的事件。只需要在事件处理函数里为Handles参数添加额外的事件。下面的例子演示了我如何为TextBox1和TextBox2同时在Handles参数里添加TextChanged事件,但是我怀疑它们只是将这个相同的参数作为源事件类似进行传递。
Private Sub TextBox1_TextChanged(ByVal Sender As System.Object,_ ByVal e As System.EventArgs)_ Handles TextBox1.TextChanged,TextBox2.TextChanged
下一个问题是分辨出是哪一个TextBox触发了这个事件。在Visual Basic.Net里事件处理函数返回一个叫做“sender”的变量指向触发这个事件的对象。要访问这个对象并察看它的属性,你需要声明一个相应的对象(在这个例子中是TextBox)然后将它定值为Sender。
Dim tbSend As TextBox=sender
在这个工作完成以后,你可以容易的访问触发这个事件的控件的属性了。
Select Case tbSent.Name Case "TextBox1" TextBox3.Text="TextBox1 contents:"&tbSent.Text.ToString Case "TExtBox2" TextBox3.Text="TextBox2 contents:"&tbSent.Text.ToString EndSelect End Sube
不幸地的是,以前在“经典”的Visual Basic中被传递的Index属性已经不存在了。因为Index属性不再需要是什么特别的数字(只需要是一个唯一的整型),我使用它来传值,这样我的事件处理函数就能够简单的把它作为一个数据值使用。
例如,当我想要演示不同的ADO LockType 属性的使用方法的时候,我可以创建一套CheckBox控件并把它们的Index属性设置成不同的LockType 枚举类型。当CheckBox Change事件发生的时候,我可以简单的把Index值赋给Recordset LockType属性。
另一种替代的方法是,你可能会想用Tag属性来传递特定控件的值或者简单的设置Name属性的值使得这个额外的值能够被引用。能够让我们的Index属性重新出现是很好的--但是我也并不是很迫切的需要这样做。
另一个技巧:当你在创建应用程序的时候你可能会删除一个表单中的控件而且希望这些代码仍然被保留。事实上这些代码(至少大部分代码)是被保留的。在Visual Basic.Net中,当你从表单中删除或者剪切一个控件的时候,为这个控件编写的事件处理代码已经改变;Visual Basic.NET提取出Handles 关键字以及参数并把它们废除。当你粘贴进你的新控件的时候你会发现Visual Basic.NET会创建一个新的事件处理函数--一个带有Handles关键字而另一些则没有。我使用一个注释符来保留Handles语句来确保这些代码不会造成麻烦。用这种方法我能够把它拷贝回我以前的事件处理函数里去。