2009-05-13 27 views
5

Sé que esta es probablemente una pregunta muy nueva, así que me disculpo.¿Se necesita una referencia de objeto para el campo, el método o la propiedad no estáticos?

Estoy intentando acceder a la propiedad Text de una etiqueta en Form1 desde otro formulario, MaxScore.

Cuando hago clic en el botón Aceptar en MaxScore, quiero establecer myGameCountLbl.Text de Form1 a la variable de Form1, max utilizando max.ToString().

Aquí está mi código en el evento botón OK de maxscore:

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

Pero cuando voy a compilarlo, me sale el error:

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

consigo el mismo error para Towergame_2 .Form1.max y Towergame_2.Form1.compGameCountLbl.

No estoy seguro de cómo solucionar esto. Max es una variable pública y las dos etiquetas también son públicas.

Gracias!

Este es el código en mi constructor (gracias lassevk para el código!):

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

Respuesta

7

¿Es por casualidad Form1 el nombre de la clase?

Debe tener una referencia a una instancia de la clase de formulario.

Dado que okBtn no está en el mismo formulario, debe dar al MaxScore una referencia a la instancia Form1.

Por ejemplo, se puede añadir a su forma MaxScore:

public Form1 MainForm { get; set; } 

Y luego, en el método de okBtn_Click, podrás escribir lo siguiente:

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

y luego cuando se está construyendo MaxScore desde Form1 (supongo que eso es lo que está haciendo):

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

Cuando agrego todo esto y trato de compilar y ejecutar, presiona ok en el botón MaxScore, obtengo una excepción en: MainForm.myGameCountLbl.Text = MainForm.max.ToString(); diciendo: NullReferenceException no se ha manejado. Referencia a objeto no establecida como instancia de un objeto. – Eric

+0

¿De hecho configuró MainForm, como mostré en el último fragmento de código? –

+0

Sí, lo hice. Tengo la última pieza de código en mi constructor Form1. – Eric

2

Estoy de acuerdo con @lassevk con respecto a la resolución de su problema. También recomendaría ajustar el comportamiento de establecer las etiquetas en un método dentro de la clase Form1, que simplemente ayuda a mantener su código más limpio y mantiene la responsabilidad/conocimiento de qué campos actualizar y cómo actualizarlos incluidos en el formulario principal. Simplemente definiría un método público en Form1 que toma un valor de cadena y actualiza las etiquetas específicas con ese valor. Luego, en el formulario de MaxScore, en el botón haga clic en controlador de eventos, llamaría a ese método en lugar de tratar de acceder a esos controles de etiqueta directamente.

Sólo algo para pensar.

+0

¡Gracias por la gran idea! – Eric

Cuestiones relacionadas