2009-05-13 8 views
5

Ich weiß, das ist wahrscheinlich eine sehr neue Frage, also entschuldige ich mich.Eine Objektreferenz ist für das nicht statische Feld, die Methode oder die Eigenschaft erforderlich?

Ich versuche, die Text -Eigenschaft eines Etiketts auf Form1 von einem anderen Formular, MaxScore zuzugreifen.

Wenn ich auf die OK-Schaltfläche auf MaxScore klicke, möchte ich Form1's myGameCountLbl.Text auf Form1's Variable, max setzen, indem ich max.ToString() benutze.

Hier ist mein Code in der OK-Taste Ereignis von MaxScore:

private void okBtn_Click(object sender, EventArgs e) 
{ 
    Form1.myGameCountLbl.Text = Form1.max.ToString(); 
    Form1.compGameCountLbl.Text = Form1.max.ToString(); 
} 

Aber wenn ich es kompilieren zu gehen, ich den Fehler:

An object reference is required for the non-static field, method, or property 'Towergame_2.Form1.myGameCountLbl'

ich den gleichen Fehler für Towergame_2 .Form1.max und Towergame_2.Form1.compGameCountLbl.

Nicht ganz sicher, wie das zu beheben ist. Max ist eine öffentliche Variable und die beiden Labels sind ebenfalls öffentlich.

Danke!

Dies ist der Code in meinem Konstruktor (danke für den Code lassevk!):

public Form1() 
{ 
    //initialize vars 
    myHp = 100; 
    compHp = 100; 
    youWon = 0; 
    compWon = 0; 
    money = 100; 
    canCompAttack = true; 
    gameOver = false; 

    //show HowToPlay Dialogue 
    HowToPlay howToPlay = new HowToPlay(); 
    howToPlay.ShowDialog(); 

    using (MaxScore maxScore = new MaxScore()) 
    { 
     maxScore.MainForm = this; 
     maxScore.ShowDialog(); 
    } 

    InitializeComponent(); 
} 

Antwort

7

ist durch Zufall Form1 den Namen der Klasse?

Sie benötigen einen Verweis auf eine Instanz der Formularklasse.

Da okBtn nicht auf demselben Formular ist, müssen Sie dem MaxScore Formular eine Referenz auf die Form1 Instanz geben.

Zum Beispiel können Sie diese auf Ihre MaxScore Form hinzufügen:

public Form1 MainForm { get; set; } 

Und dann in Ihrem okBtn_Click Methode, werden Sie schreiben dies:

private void okBtn_Click(object sender, EventArgs e) 
{ 
    MainForm.myGameCountLbl.Text = MainForm.max.ToString(); 
    MainForm.compGameCountLbl.Text = MainForm.max.ToString(); 
} 

und dann, wenn Sie den Bau MaxScore von Form1 (Ich gehe davon aus, dass Sie das tun):

using (MaxScore scoreForm = new MaxScore()) 
{ 
    scoreForm.MainForm = this; 
    scoreForm.ShowDialog(); 
} 
+0

Wenn ich all dies hinzufügen und zu kompilieren und zu starten, drücken Sie OK auf der MaxScore-Taste, ich bekomme eine Ausnahme unter: MainForm.myGameCountLbl.Text = MainForm.max.ToString(); sagen: NullReferenceException wurde nicht behandelt. Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt. – Eric

+0

Hast du eigentlich MainForm gesetzt, wie ich es im letzten Code dort gezeigt habe? –

+0

Ja, tat ich. Ich habe den letzten Code in meinem Form1-Konstruktor. – Eric

2

Ich stimme @lassevk in Bezug auf die Lösung Ihres Problems zu. Ich würde auch empfehlen, das Verhalten des Festlegens der Beschriftungen in eine Methode innerhalb der Form1-Klasse einzuschließen, die lediglich dazu beiträgt, dass Ihr Code sauberer bleibt und die Verantwortung/Kenntnis der zu aktualisierenden Felder und deren Aktualisierung im übergeordneten Formular behält. Sie würden einfach eine öffentliche Methode in Form1 definieren, die einen Zeichenfolgenwert übernimmt und die spezifischen Beschriftungen mit diesem Wert aktualisiert. Dann würden Sie im MaxScore-Formular in Ihrem Button-Click-Ereignishandler diese Methode aufrufen, anstatt direkt auf diese Label-Steuerelemente zuzugreifen.

Nur Denkanstoß.

+0

Danke für die tolle Idee! – Eric

Verwandte Themen