Как узнать, проиндексирован ли элемент управления VB6 (массив элементов управления) в .NET - PullRequest
2 голосов
/ 16 декабря 2010

Я работал над проектом VB.NET, чтобы манипулировать формой VB6 с помощью COM Interop.Некоторые элементы управления в моей форме VB6 проиндексированы, а некоторые нет, поэтому вызов ctl.Index не выполняется для тех, у которых нет индекса.Есть ли способ решить, если элемент управления проиндексирован?

Ответы [ 3 ]

2 голосов
/ 26 ноября 2015

Я нашел решение, похожее на @ Matt Wilko , но оно избегает необходимости перебирать все элементы управления в форме:

Public Function IsControlArray(objCtrl As Object) As Boolean
    IsControlArray = Not objCtrl.Parent.Controls(objCtrl.Name) Is objCtrl
End Function

Источник: http://www.vbforums.com/showthread.php?536960-RESOLVED-how-can-i-see-if-the-object-is-array-or-not

2 голосов
/ 16 декабря 2010

Мне удалось расколоть решение, чтобы заставить это работать. Но это не так эффективно, так как каждый раз проходит через все элементы управления в форме. Кажется, я помню, что в глубине души есть функция VB6 для проверки, является ли элемент управления массивом, но я не могу вспомнить его. Моя функция для всех, кто интересуется, ниже, но мне все равно было бы интересно найти более чистое решение, если это возможно?

Private Function FindIndex(ByRef objCtl As Object) As Integer
    For Each ctl As Object In objCtl.Parent.Controls
        If objCtl.Name = ctl.Name AndAlso Not objCtl.Equals(ctl) Then
            'if the object is the same name but is not the same object we can assume it is a control array
            Return objCtl.Index
        End If
    Next
    'if we get here then no controls on the form have the same name so can't be a control array
    Return 0
End Function

Ниже приведен эквивалент VB6, если кому-то интересно:

Private Function FindIndex(ByRef F As Form, ByRef Ctl As Control) As Integer
    Dim ctlTest As Control
    For Each ctlTest In F.Controls
        If (ctlTest.Name = Ctl.Name) And (Not (ctlTest Is Ctl)) Then
            'if the object is the same name but is not the same object we can assume it is a control array
            FindIndex = Ctl.Index
            Exit Function
        End If
    Next
    'if we get here then no controls on the form have the same name so can't be a control array
    FindIndex = 0
End Function
1 голос
/ 27 ноября 2012

В vb6 вы можете использовать функцию TypeName - массивы элементов управления будут возвращать тип «Объект», а не фактический тип элемента управления - например, так:

If TypeName(ctrl) = "Object" Then
  isControlArray = true
End If
...