如何在.NET中查明VB6控件是否已编入索引(控件数组)

时间:2010-12-16 10:52:42

标签: vb.net vb6 com-interop vb6-migration

我正在使用一个VB.NET项目来使用COM Interop操作VB6表单。我的VB6表单上的一些控件是索引的,有些则没有,所以在没有索引的那些上调用ctl.Index会失败。如果控件被编入索引,有没有办法解决?

4 个答案:

答案 0 :(得分:2)

我已经设法使用刀叉解决方案来实现这一目标。但它并不是那么有效,因为它每次都会遍历表单上的所有控件。我似乎记得在我的脑海里有一个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 :(得分:2)

我找到了类似于@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 :(得分:1)

在vb6中你可以使用TypeName函数 - 控件数组将返回类型“Object”,而不是实际的控件类型 - 如下所示:

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

答案 3 :(得分:0)

如果控制数组中只有一个成员,则上面提出的解决方案将不起作用。 测试控件是否作为控件数组成员的一种简单方法是测试控件的Index属性(控件数组)。这将返回唯一标识控件数组中的控件的数字。仅当控件是控件数组的一部分时可用。

const [getEvents, eventsData] = useQuery(GET_EVENTS),
const [createEvent, createdData] = useMutation(CREATE_EVENT)
// access:
eventsData.data
createdData.data