如何根据名称和索引检索VB控件实例?

时间:2017-04-12 14:00:35

标签: arrays string vb6

如果我有一个字符串“cboEnoughMoney(0)”,是否可以从我的表单cboEnoughMoney中的控件数组中检索控件?

在我的代码中,我尝试以这种方式引用控件:

frm.Controls(sControlName).ListIndex = -1 
在这种情况下,

sControlName是“cboEnoughMoney(0)”,我收到一个错误,指出没有找到控件。

编辑:我遇到的一个问题是尝试如上所述将.listindex设置为-1,另一个是我实际尝试获取并将值设置为组合框的地方。在函数中 - 我将表单名称作为参数传递给frm。

在代码中已经完成的是......

dim ctlData as string
If Frm.Controls(RS!CTRLname).ListIndex > 0 Then
      CtlData = Frm.Controls(RS!CTRLname).Value
Else
      CtlData = ""
End If

我知道如何用cboEnoughMoney(0)做到这一点......

我假设我可以按照你的例子检查

if instr(1,RS!CTRLname, "(")

但如果有,我将如何在frm中引用该特定控件

2 个答案:

答案 0 :(得分:2)

您无法通过(index)在查找中使用.Controls部分。

您可以手动循环播放它们鉴于您可以安全地假设任何具有(的控件名称是一个数组成员,因此将具有Index属性匹配:

Private Function GetControl(ByVal name As String) As VB.Control
    Dim pos As Long: pos = InStr(name, "(")

    If pos = 0 Then
        Set GetControl = Me.Controls(name) '// non array
    Else
        Dim index As Long
        index = Val(Mid$(name, pos + 1))   '// get index #
        name = Left$(name, pos - 1)        '// get base name

        For Each GetControl In Me.Controls
           If (GetControl.name = name) Then
                If (GetControl.index = index) Then Exit Function
            End If
        Next

        Set GetControl = Nothing
    End If
End Function

然后:

GetControl("cboEnoughMoney(1)").ListIndex = -1

答案 1 :(得分:2)

只需查看VB属性窗口即可:如果搜索" cboEnoughMoney(0)"你会发现" cboEnoughMoney"(0)(没有双引号)。该名称仍然与非数组控件相同。

Properties Window

因此,使用名称和索引引用VB控件是完全合法的,这里不需要控制循环:

If isControlsArray Then
    Set ctrl = Me.Controls(Name)(Index) '// array
Else
    Set ctrl = Me.Controls(Name) '// non array
End If