2

我正在努力从不同的形式中获取一个类而不使其成为静态的,这就是我想要做的:

//First form
public partial class SetupScreen : Form
{
    Control myObject;
    public Battleship myBattleship;

    public SetupScreen()
    {
        InitializeComponent();
        //Create Class Object
        myBattleship = new Battleship();
    }
}

//Launch second form 
public partial class GameScreen : Form
{
    Control myObject;
    Battleship myBattleship;
    Battleship fredBattleship;

    public GameScreen()
    {
        InitializeComponent();
        //Get the class
        myBattleship = SetupScreen.myBattleship;
    }
}

我不断收到错误“非静态字段、方法或属性需要对象引用”

我希望整个表单都可以访问该类,而不仅仅是一个方法,因此我不想每次都通过它,因为这很麻烦

我不想让类成为静态的,因为它不能被删除,我该怎么做呢?

4

3 回答 3

1

您收到此错误是因为您尝试以静态方式访问非静态字段。

你在哪里实例化 SetupScreen 和 GameScreen?

为什么不这样:

public partial class SetupScreen : Form
{
    private Control myObject;
    public Battleship myBattleship;
    private GameScreen gameScreen;

    public SetupScreen()
    {
        InitializeComponent();
        //Create Class Object
        myBattleship = new Battleship();
        gameScreen = new GameScreen(this);
    }
}

public partial class GameScreen : Form
{
    private Control myObject;
    private Battleship myBattleship;
    private Battleship fredBattleship;
    private SetupScreen setupScreen;

    public GameScreen(SetupScreen setupScreen)
    {
        InitializeComponent();

        this.setupScreen = setupScreen;
        myBattleship = this.setupScreen.myBattleship;

    }
}

当然,这仅在您可以在 SetupScreen 中实例化 GameScreen 时才有效。如果你告诉我你在哪里/如何“启动”这些表格,我可以给你一个更好的答案。

于 2013-03-29T01:48:52.773 回答
1

您可以将您的第一个表单的引用传递给您的第二个表单,或者(我会做什么)Battleship在您的第二个表单上创建一个公共属性并以这种方式传递您的对象。

//First form
public partial class SetupScreen : Form
{
    Control myObject;
    public Battleship myBattleship;

    public SetupScreen()
    {
        InitializeComponent();
        //Create Class Object
        myBattleship = new Battleship();

        Form gameForm = new GameScreen(); // New form object
        gameForm.MyBattleship = myBattleship; // Set property
        gameForm.Show(); // Show form
    }
}

//Second form 
public partial class GameScreen : Form
{
    Control myObject;
    Battleship fredBattleship;

    public BattleShip MyBattleship { set; get; }

    public GameScreen()
    {
        InitializeComponent();
    }
}
于 2013-03-29T01:51:24.233 回答
-1

你必须使用单例模式。所以你的代码必须是这样的:

//First form
public partial class SetupScreen : Form
{
 public static SetupScreen setupScreenFrm;
 Control myObject;
 public Battleship myBattleship;

 public SetupScreen()
 {
    setupScreenFrm=this;
    InitializeComponent();
    //Create Class Object
    myBattleship = new Battleship();
 }
}

//Launch second form 
public partial class GameScreen : Form
{
 Control myObject;
 Battleship myBattleship;
 Battleship fredBattleship;

 public GameScreen()
 {
    InitializeComponent();
    //Get the class
    SetupScreen ssFrm=SetupScreen.setupScreenFrm;
    myBattleship = ssFrm.myBattleship;
 }
}

首先,在您的应用程序开始时,创建一个 SetupScreen 表单。

现在您可以在任何地方访问 SetupScreen。

于 2014-08-26T16:22:37.777 回答