简体   繁体   中英

Access class from another form

I'm struggling to get a class from a different form without making it static, here's what I want to do:

//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;
    }
}

I keep getting the error "an object reference is required for the non-static field, method or property"

I want the class to be accessible by the whole form, not just a single method therefore I don't want to pass it through each time because this is a hassle

I don't want to make the class static since it cannot be erased, how would I go about doing this?

You could pass a reference of your first form to your second form, or (what I would do), create a public Battleship property on your second form and pass your object that way.

//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();
    }
}

You are getting this error because you are trying to access a non-static field in a static manner.

Where do you instantiate SetupScreen and GameScreen?

Why not something like this:

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;

    }
}

Of course, this will only work if you can instantiate GameScreen in SetupScreen. I could give you a better answer if you tell me where/how you are "launching" these forms.

you must use singleton pattern. so your code must be like this:

//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;
 }
}

and first of all, in the start of your app, create an instant of SetupScreen form.

now you can access to SetupScreen in anywhere.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM