如何访问此变量?

时间:2017-01-30 20:21:22

标签: vb.net vb6 vb6-migration

我是VB新手,我目前正在迁移我没有写入.net的vb6应用程序,而且我正在努力解决此错误,

If TypeOf Application.OpenForms.Item(i) Is frmAddChangeDelete Then
            'UPGRADE_ISSUE: Control ctrlAddChangeDelete1 could not be resolved because it was within the generic namespace Form. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="084D22AD-ECB1-400F-B4C7-418ECEC5E36E"'

            If **Application.OpenForms.Item(i).ctrlAddChangeDelete1.ParentFormNumber = intFormNumber** Then

                If Application.OpenForms.Item(i).Text = "Add Proofed Expense Items" Then
                    boolAddProofed = True
                    Exit For

ctrlAddChangeDelete1应该是从一个单独的VB文件调用朋友类ctrlAddChangeDelete,所以我不确定它为什么这么说

"'ctrlAddChangeDelete1' is not a member of 'System.Windows.Forms.Form'."

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

Application.OpenForms是一个非强类型的集合 当你在那里引用元素时,你会得到一个通用的表格 在通用表单中,没有名为 ctrlAddChangeDelete1 的控件

如果您有一个名为 frmAddChangeDelete 的表单派生类,并且此类具有名为 ctrlAddChangeDelete1 的控件,那么您需要将存储在OpenForms集合中的引用强制转换为您的特定表单在尝试引用该控件之前的类。

此外,要从外部代码访问该控件,还应将Modifiers属性设置为Public而不是默认的Internal。否则,您将无法从该类外部的任何代码访问该控件。

要正确检索表单,您可以写

Dim delForm = Application.OpenForms.
                         OfType(Of frmAddChangeDelete)
                         FirstOrDefault()
If delForm Is Nothing Then
    ' No form of type frmAddChangeDelete is present in the collection
    ' write here your message and exit ?
Else 
    ' Now you can use delForm without searching again in the collection
    ......

上面的代码使用IEnumerable.OfType扩展名,这需要Imports System.Linq 如果您不想使用此功能,那么您始终可以使用TryCast运算符来获取对正确类的引用

' Still you need a for loop up ^^^^ before these lines
Dim delForm = TryCast(Application.OpenForms(i), frmAddChangeDelete)
if delForm Is Nothing then 
   ....
else
   ....