Kehza
Kehza

Reputation: 423

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?

Upvotes: 2

Views: 8290

Answers (3)

user2852297
user2852297

Reputation: 109

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.

Upvotes: -1

Ryan Frame
Ryan Frame

Reputation: 285

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

Upvotes: 1

Tom
Tom

Reputation: 2390

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.

Upvotes: 1

Related Questions