2009-05-13 18 views
5

So che questa è probabilmente una domanda molto nuova, quindi mi scuso.Un riferimento a un oggetto è richiesto per il campo, il metodo o la proprietà non statici?

Sto tentando di accedere alla proprietà Text di un'etichetta su Form1 da un altro modulo, MaxScore.

Quando faccio clic sul pulsante OK su MaxScore, desidero impostare Form1's myGameCountLbl.Text sulla variabile di Form1, max utilizzando max.ToString().

Ecco il mio codice in caso pulsante OK di MaxScore:

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

Ma quando vado a compilarlo, ottengo l'errore:

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

ottengo lo stesso errore per Towergame_2 .Form1.max e Towergame_2.Form1.compGameCountLbl.

Non so bene come risolvere questo problema. Max è una variabile pubblica e le due etichette sono anche pubbliche.

Grazie!

Questo è il codice nel mio costruttore (Grazie lassevk per il codice!):

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

risposta

7

È per caso Form1 il nome della classe?

È necessario disporre di un riferimento a un'istanza della classe del modulo.

Poiché lo okBtn non è nello stesso modulo, è necessario fornire alloun riferimento all'istanza Form1.

Per esempio, è possibile aggiungere questo al modulo MaxScore:

public Form1 MainForm { get; set; } 

E poi nel metodo okBtn_Click, potrai scrivere questo:

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

e poi quando si sta costruendo MaxScore da Form1 (presumo che sia quello che stai facendo):

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

Quando aggiungo tutto questo e provo a compilare ed eseguire, premere ok sul pulsante MaxScore, ottengo un'eccezione su: MainForm.myGameCountLbl.Text = MainForm.max.ToString(); dicendo: NullReferenceException non è stato gestito. Il riferimento non impostato su un'istanza di un oggetto. – Eric

+0

In realtà hai impostato MainForm, come ho mostrato nell'ultimo pezzo di codice? –

+0

Sì, l'ho fatto. Ho l'ultimo pezzo di codice nel mio costruttore di Form1. – Eric

2

Sono d'accordo con @lassevk per quanto riguarda la risoluzione del problema. Ti consigliamo inoltre di impostare il comportamento di impostare le etichette in un metodo all'interno della classe Form1, che semplicemente aiuta a mantenere il codice più pulito e mantiene la responsabilità/conoscenza di quali campi aggiornare e come aggiornarli contenuti nel modulo padre. Dovresti semplicemente definire un metodo pubblico in Form1 che accetta un valore stringa e aggiorna le etichette specifiche con quel valore. Quindi, nel modulo MaxScore, nel gestore eventi del clic del pulsante, chiameresti tale metodo piuttosto che provare ad accedere direttamente a questi controlli etichetta.

Solo spunti di riflessione.

+0

Grazie per l'ottima idea! – Eric

Problemi correlati