如何制作控制阵列?或等效的。
我习惯使用Visual Basic 6,它提供了在复制,粘贴和控制时是否创建控件数组的选项。
答案 0 :(得分:6)
控制阵列早已不复存在。面向对象的方法现在是VB的土地法则。
您需要使用某种类型的集合,例如list。
答案 1 :(得分:2)
容易被忽视的控制数组的另一个隐含特性是数字索引与数组的每个元素的关联。索引可以是任何正整数,只要它们在集合中是唯一的;他们不必是顺序的。因此,数组更像是由整数索引的字典,每个项值是特定类型控件的实例。
控件数组的VB6事件处理程序中的逻辑获取索引的值以及要处理的事件的属性。处理程序中的逻辑通常使用索引来确定控件的哪个实例引发了事件。
.NET事件处理程序完全不同。您通常会获得对特定控件实例的引用以及具有要处理的事件属性的特定事件对象的实例。你不会得到索引。
此外,VB6应用程序有时具有以数组的形式迭代/操作控件数组的逻辑。
在我们的默认翻译中,我们尝试支持显式依赖于控件数组及其索引的传统VB6逻辑。我们将控制数组重写为一组独立的控件实例,然后将它们添加到通用的OrderDictionary< int,controlType>在表单初始化期间各个控件订阅事件,我们可以使用集合查找给定控件实例的索引,或者迭代/操作“数组”中的项目。如果您不明确需要索引或数组,则可以删除该集合。
动态添加控件现在工作更多 - 它在概念上就像在控件数组中添加一个项目,并在VB6(Load control)中使用单个语句支持。据我所知,在.NET中,您需要克隆控件,显式深度复制属性,并明确地挂钩事件处理程序。它可以使用反射和其他适度的先进技术进行推广 - 但它肯定不是简单地称为“负载控制”。如果在.NET中有一种更简单的方法可以做到这一点,我很乐意听到它。 FWIW:我们转换为辅助函数。
答案 2 :(得分:0)
VB6中的控件数组仅存在,允许单个事件处理程序用于同一类型的多个控件。
通过将控件放入Handles
子句:
private sub Button_Click(...) Handles Command1.Click, Command2.Click, Command3.Click
end sub
答案 3 :(得分:0)
有三种方法可以创建控制数组。
答案 4 :(得分:0)
您只能通过代码执行操作。例如:
Dim c() As TextBox
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim j As Integer
For j = 0 To 10
ReDim Preserve c(j)
c(j) = New TextBox
c(j).Name = "txt" & j
c(j).Parent = Me
c(j).Top = j * c(j).PreferredHeight + 2
c(j).Tag = j
c(j).Visible = True
AddHandler c(j).KeyPress, AddressOf TestKeyPress
Next
End Sub
Public Sub TestKeyPress(source As Object, e As KeyPressEventArgs)
Dim index As Integer
index = CInt(source.tag)
If index >= 5 Then
If e.KeyChar > "9" Or e.KeyChar < "0" Then
e.Handled = True
End If
Else
If e.KeyChar <= "9" And e.KeyChar >= "0" Then
e.Handled = True
End If
End If
End Sub
这将创建11个文本框,分配给所有相同的事件处理程序。
TAG属性用于存储和检索文本框的idex。