我是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'."
感谢任何帮助,谢谢!
答案 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
....