2009-05-13 10 views
5

Je sais que c'est probablement une question très nouveau, alors je m'en excuse. J'essaie d'accéder à la propriété Text d'une étiquette sur Form1 à partir d'un autre formulaire, MaxScore.Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique?

Lorsque je clique sur le bouton Ok sur MaxScore, je veux définir myGameCountLbl.Text de Form1 à la variable de Form1, max en utilisant max.ToString().

Voici mon code en cas de bouton OK de MaxScore:

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

Mais quand je vais compiler, je reçois l'erreur:

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

je reçois la même erreur pour Towergame_2 .Form1.max et Towergame_2.Form1.compGameCountLbl.

Vous ne savez pas trop comment résoudre ce problème. Max est une variable publique et les deux étiquettes sont également publiques.

Merci!

Voici le code dans mon constructeur (merci lassevk pour le code!):

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

Répondre

7

Est-ce par hasard Form1 le nom de la classe?

Vous devez disposer d'une référence à une instance de la classe de formulaire.

Étant donné que okBtn n'est pas sur la même forme, vous devez donner au formulaire MaxScore une référence à l'instance Form1.

Par exemple, vous pouvez ajouter à votre formulaire MaxScore:

public Form1 MainForm { get; set; } 

Et puis dans votre méthode okBtn_Click, vous écrivez ceci:

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

et puis quand vous construisez MaxScore de Form1 (Je suppose que c'est ce que vous faites):

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

Lorsque j'ajoute tout cela et que j'essaie de compiler et d'exécuter, appuyez sur ok sur le bouton MaxScore, j'obtiens une exception à: MainForm.myGameCountLbl.Text = MainForm.max.ToString(); disant: NullReferenceException n'a pas été gérée. La référence d'objet n'est pas définie à une instance d'un objet. – Eric

+0

Avez-vous réellement défini MainForm, comme je l'ai montré dans le dernier morceau de code? –

+0

Oui, je l'ai fait. J'ai le dernier morceau de code dans mon constructeur Form1. – Eric

2

Je suis d'accord avec @lassevk en ce qui concerne la résolution de votre problème. Je vous recommande également d'encapsuler le comportement de définir les étiquettes dans une méthode dans la classe Form1, ce qui permet simplement de garder votre code plus propre et garde la responsabilité/connaissance des champs à mettre à jour et comment les mettre à jour dans le formulaire parent. Vous définiriez simplement une méthode publique dans Form1 qui prend une valeur de chaîne et met à jour les étiquettes spécifiques avec cette valeur. Ensuite, dans le formulaire MaxScore, dans votre gestionnaire d'événements de clic de bouton, vous appelez cette méthode plutôt que d'essayer d'accéder directement à ces contrôles d'étiquette.

Juste matière à réflexion.

+0

Merci pour la bonne idée! – Eric

Questions connexes