我正在将一个应用程序从VB.NET转换为WinForms应用程序中的C#。
当我意识到你不能像在VB.NET中那样直接访问其他表单时出现问题,例如:
Public Class frmMain
Private Sub Preferences_Click(sender...
frmPreferences.Show()
End Sub
End Class
所以我在网上看了一下,在我改变其控件的值之前,我似乎必须声明对表单的引用。所以:
我现在有两种不同的形式。一个名为frmPreferences
,看起来像没有额外的代码:
public partial class frmPreferences : Form
{
frmMain frmMain = new frmMain();
}
另一方,frmMain
,只是声明另一种形式:
public partial class frmMain : Form
{
frmPreferences frmPreferences = new frmPreferences();
}
调用堆栈显示:
WTAppCSharp.exe!WTAppCSharp.frmMain.frmMain()第17行C#
WTAppCSharp.exe!WTAppCSharp.frmPreferences.frmPreferences()第38行C#
WTAppCSharp.exe!WTAppCSharp.frmMain.frmMain()第17行C#
WTAppCSharp.exe!WTAppCSharp.frmPreferences.frmPreferences()第38行C#
....
我只是不确定如何正确引用表单,或者我做错了什么:(
希望有人可以提供帮助:)
答案 0 :(得分:1)
问题在于你创造了一个无限循环。你的两个构造函数互相引用。您可以从frmPreferences中删除引用,甚至可以完全删除无参数构造函数。
public frmMain()
{ //this is all you need.
frmPreferences frmPreferences = new frmPreferences();
frmPreferences.Show();
}
这将修复它,并为您弹出“首选项”表单。我会将所有变量名称更改为与它们调用的类名称和大小写不同。在进行故障排除时这是有意义的,您可能会开始从intellisense收到错误,说无论如何都无法做到这一点。
编辑:更具体地说,通过在属性上使用默认值,您将调用其他对象的无参数构造函数来填充该属性。然后调用你的第一个对象的属性,然后再调用第二个属性,依此类推。