对非共享成员的引用需要参考

时间:2014-02-03 23:06:09

标签: vb.net winforms vb6 vb6-migration selectedindex

我正在将一些代码从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

它爆炸了,并说:

enter image description here

frmMain的声明如下:

enter image description here

如何解决此错误?

TL; DR

this视频中有更详细的描述。

2 个答案:

答案 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上设置监视表达式在这种特定情况下是明显的解决方法。