我正在将一些代码从vb6应用程序更新到VB.NET。
当我尝试从主窗体中打开表单时出现问题。
它调用此函数:
Public Sub optDrawSafeFile_CheckedChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles optDrawSafeFile.CheckedChanged
If eventSender.Checked Then
'--------------------------------------------------------------------------------
' JRL 11-03-06
' change the enables
UpdateGUI((False))
cboProject.SelectedIndex = frmMain.cboProjects.SelectedIndex
SelectJob()
End If
End Sub
当它执行此行时:
cboProject.SelectedIndex = frmMain.cboProjects.SelectedIndex
它爆炸了,并说:
frmMain的声明如下:
如何解决此错误?
this视频中有更详细的描述。
答案 0 :(得分:4)
简短回答:将frmMain更改为My.Forms.frmMain。
cboProject.SelectedIndex = My.Forms.frmMain.cboProjects.SelectedIndex
答案很长:
在VB6中,通过名称引用表单允许您将其作为类和该类的实例进行访问。以这种方式访问的实例称为默认实例。这在VB.NET中是不可能的。但是,VB.NET包含一个动态生成的类My.Forms,它提供类似于默认实例的功能。
有关My.Forms和“我的”命名空间的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms379610%28v=vs.80%29.aspx#vbmy_topic3。
然而,更好和更面向对象的方法是将主窗体的实例传递给frmAddMethod窗体的构造函数,并将其存储在实例字段中。
因此,在frmAddMethod.vb的类定义中:
Sub New(ByVal mainForm As frmMain)
_mainForm = mainForm
End Sub
Private _mainForm as frmMain
当你从frmMain创建frmAddMethod实例时,将“Me”传递给构造函数:
Dim addMethodForm as new frmAddMethod(Me)
“Me”是从中调用非共享类方法的类的实例。
这将允许您使用_mainForm类字段从frmAddMethod的非共享方法访问主窗体的实例。
*根据Plutonix的评论编辑推荐My.Forms而不是DefInstance。
答案 1 :(得分:2)
没有什么是“炸毁”,你的程序没有崩溃。使用类型名称,如frmMain
,其中需要对象引用是VB.NET编译器允许的。特别是对于Form类,一个针对VB6代码的appcompat hack。 调试器对此没有多大考虑。它只是为您的监视表达式提供诊断,因为它没有编译器那样的appcompat hack。所以不知道要显示什么。
您可以使用My.Forms来获取活动表单对象引用。所以让你的手表表达:
My.Forms.frmMain.cboProjects.SelectedIndex
只有在单步执行代码时才执行此操作,如果使用Debug + Break All进入程序,它仍然会出错。在Me.cboProject上设置监视表达式在这种特定情况下是明显的解决方法。