WTApp

时间:2017-02-02 18:48:41

标签: c# winforms

我正在将一个应用程序从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#
....

我只是不确定如何正确引用表单,或者我做错了什么:(

希望有人可以提供帮助:)

1 个答案:

答案 0 :(得分:1)

问题在于你创造了一个无限循环。你的两个构造函数互相引用。您可以从frmPreferences中删除引用,甚至可以完全删除无参数构造函数。

    public frmMain()
    {  //this is all you need.
        frmPreferences frmPreferences = new frmPreferences();
        frmPreferences.Show();
    }

这将修复它,并为您弹出“首选项”表单。我会将所有变量名称更改为与它们调用的类名称和大小写不同。在进行故障排除时这是有意义的,您可能会开始从intellisense收到错误,说无论如何都无法做到这一点。

编辑:更具体地说,通过在属性上使用默认值,您将调用其他对象的无参数构造函数来填充该属性。然后调用你的第一个对象的属性,然后再调用第二个属性,依此类推。