在运行时获取控件数组中的usercontrol的索引

时间:2014-08-28 10:41:04

标签: user-controls vb6

所以我有一个用户控件。 在表单中,我有一个这些用户控件的控件数组。控件的每个实例都在设计器中设置了索引。

我想在运行时获取特定用户控件的索引(这是在For Each循环的上下文中)。然而,"索引"不是UserControl类的成员。我该怎么做才能在运行时获取索引?

我想要做的例子:

for each UserControl in UserControls
    OtherArray(UserControl.index) = UserControl.value
next UserControl

5 个答案:

答案 0 :(得分:2)

Index属性是ControlExtender对象的成员,但不是用户控件。

您可以通过正确键入变量来获取索引:

Dim UserControl As MyUserControlType
Dim UserControl2 As Control

For Each UserControl In UserControls
    Set UserControl2 = UserControl
    OtherArray(UserControl2.index) = UserControl.value
Next UserControl

您仍需要一个用户控件类型的变量来访问Value属性。

前一种方法不再有效。

由于用户控件可以通过其Index对象访问其Extender,因此您可以添加调用者可以使用的其他属性:

Public Property Get MyIndex() As Long
  MyIndex = Extender.Index
End Property

这是访问它:

Dim MyUserControlInstance As MyUserControl
Dim OtherArray() As String
ReDim OtherArray(0 To 3)

For Each MyUserControlInstance In MyUserControlArray
    OtherArray(MyUserControlInstance.MyIndex) = MyUserControlInstance.Value
Next MyUserControlInstance

答案 1 :(得分:0)

VB6中的大多数控件都有Tag属性。 (已经有一段时间了,所以我不记得用户控件是否也拥有此属性。)

如果有,您可以在表单设计器中将Tag属性设置为与数组索引相同的值。

如果用户控件没有Tag属性,则可以在程序启动时循环遍历数组,并在每个User Control中设置其中一个控件的Tag属性。例如,选择一些Label或TextBox控件来保存" Tag"整个Uset Control的属性。

答案 2 :(得分:0)

尝试使用for循环并按索引访问它们:

For I = UserControls.LBound To UserControls.UBound
  'Use I as the index here
Next

请注意,如果数组不连续(中间的某些索引未加载),则需要检测错误并跳到下一个项目。

答案 3 :(得分:0)

我建议对上面的代码进行一些改进:

如果UserControl不在数组中,则Extender.Index会导致错误。 如果Usercontrol不在数组中,则MyIndex返回-1。

公共属性只要获取MyIndex()

出错时转到ToAnAnArrayNoIndexError

MyIndex = Extender.Index

出错时转到0

退出物业

NotAnArrayNoIndexError:

出错时转到0

MyIndex = -1

最终属性

答案 4 :(得分:-2)

"名称"属性。在ControlsCollection中,每个Control都有一个名称。

dim i as long
dim found as boolean
for i = lBound(OtherArray) to uBound(OtherArray)
  for each UserControl in UserControls
    if OtherArray(i).name = UserControl.name then
      found = true
      exit for
    end if
    next UserControl
  if found then exit for
next UserControl