在构造期间,表单从默认实例引用自身,这导致无限递归

时间:2013-08-26 06:09:17

标签: vb.net recursion

我目前正在尝试使用带有图形用户界面的QuickFix创建一个简单的客户端(Initiator)。我正在使用Visual Studio 2012并在VB.Net中编程。

这是我的问题: 当我启动我的应用程序时,我有这样的错误:“WindowsApplication1.exe中发生了'System.InvalidOperationException'类型的未处理异常

其他信息:创建表单时出错。有关详细信息,请参阅Exception.InnerException。错误是:表单在构造期间从默认实例引用自身,这导致无限递归。在Form的构造函数中,使用'Me。'“

来引用表单

我的项目中有两个文件,即Client GUI.vb(http://pastebin.com/virgVNyS)和MyQuickFixApp.vb(http://pastebin.com/tQ1GXNSx)。第二个包含将IApplication与所有子集合集成的类。

执行此行时发生错误:来自客户端GUI.vb的“Dim initiator As New SocketInitiator(myApp,storeFactory,settings,logFactory)” 但该软件突出显示了Application.Designer.vb文件中的一行:

Protected Overrides Sub OnCreateMainForm()
    Me.MainForm = Global.WindowsApplication1.ClientGUI
End Sub

你能帮助我并告诉我出了什么问题吗?

非常感谢!

2 个答案:

答案 0 :(得分:4)

在处理WinForms时,避免问题的最佳方法是在构造/加载GUI之后初始化所有内容(除了简单的变量赋值,例如:Dim filename As String = "initiator.cfg"很好)(在_Load上方法)。您收到此错误的原因是因为在实际创建之前引用了主窗体(Me.MainForm =)。

Dim initiator As New SocketInitiator(myApp, storeFactory, settings, logFactory)移至ClientGUI_Load(主窗体的Load Event方法),错误将消失。

注意:如果您想从“任何地方”访问initiator,您应该保留全局声明,但将分配移动到Load事件,即:

Dim initiator As SocketInitiator 'at the Class level, outside any sub/function (as previously)

initiator = New SocketInitiator(myApp, storeFactory, settings, logFactory) 'Inside the ClientGUI_Load method. 

答案 1 :(得分:2)

我有类似的问题;我希望我对它的描述和我发现的解决方案可能会在将来为其他人提供清晰的信息。

我为网格背景颜色声明了两个常量。选定的行应为黄色。我还说过,未选择的行应该是表单上其中一个网格的默认背景颜色:

Private MatchColor As Color = Color.Yellow
Private NormalColor As Color = MyFormsDataGridView.BackgroundColor ' <<< this line is bad.

这是在表单的声明部分,在任何代码运行之前!我收到了错误并且被打了几个小时。我甚至读过这篇文章,但它没有沉入其中。

问题当然是我指的是一个尚未实例化的表格上的网格属性!

解决方案是:

Private MatchColor As Color = Color.Yellow
Private NormalColor As Color = Color.White ' <<< this is the fix.

然后加载就好了!

我希望有所帮助。