2

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?

2
  • If you write SetupScreen.myBattleship then you're trying to access a static member called myBattleship within class SetupScreen. I guess want you want to do is instantiate a new Battleship object: myBattleship = new Battleship(). If you want to use the same Battleship object throughout the program, then you are going to have some static object. Probably you're looking for the Singleton pattern. Commented Mar 29, 2013 at 1:47
  • Possible duplicate of Access form component from another class Commented Jul 21, 2016 at 2:54

3 Answers 3

1

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.

Sign up to request clarification or add additional context in comments.

1 Comment

I can see what you have done here, and implement it into my code thanks :)
1

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

Comments

-1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.