2012-09-09 15 views
7

Pido disculpas de antemano con lo que probablemente será una respuesta bastante fácil/rápida basada en el alcance, pero he buscado en todas partes y estoy sorprendido de no encontrar una responder.Visual C# - Ejemplo de acceso del objeto creado en una clase en otra

He creado una clase llamada Soldado con aproximadamente 100 variables de clase. Necesito que un usuario ingrese información y construya gradualmente un objeto Solider en el transcurso de varios formularios de clases diferentes (porque hay demasiados datos para recopilar en solo uno).

puedo crear una instancia (vacío) de un soldado (tempSoldier) en Form1.cs y empezar a establecer variables de clase del objeto que cobrar a los usuarios.

private void button1_Click(object sender, EventArgs e) 
{ 
    Soldier tempSoldier = new Soldier(); 
    tempSoldier.surname = textbox1.text; 
} 

Mi pregunta: ¿cómo hago para acceder a la instancia del objeto (tempSoldier) de Form1.cs en las otras clases (Form2.cs, Form3.cs ...)?

Debo mencionar que todos los formularios (Form1.cs, Form2.cs ...) comparten el mismo espacio de nombres.

Gracias de antemano

Editar: Todas las soluciones a continuación el trabajo por lo que sólo depende de cuál le gusta el mejor. Gracias por tus comentarios. Una pequeña nota, asegúrese de hacer que TODOS los modificadores de clase sean públicos, incluida su clase personalizada (en mi caso, Soldier.cs).

+0

Su declaración local tendrá una av ery breve duración de la vida. Si lo declaró en el formulario en lugar de un método en el formulario, puede referirse a él en otro lugar como 'Form1.tempSoldier'. – HABO

Respuesta

7

Deberá declarar la instancia Soldier en un ámbito superior.

Una forma de hacer esto sería declarar que el interior Form1, a continuación, pasar a Form2 , y así sucesivamente.

public class Form1 
{ 
    private Soldier tempSoldier = new Soldier(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     tempSoldier = new Soldier(); 
     tempSoldier.surname = textbox1.text; 
    } 

    private void GotoNextStep() 
    { 
     // pass the existing instance to the next form 
     Form2 form2 = new Form2(tempSoldier); 

     // display form 2 ... 
    } 
} 

Otra posibilidad es utilizar una variable Singleton en una clase que todas las formas tienen acceso.

public class MyAppManager 
{ 
    private static readonly Soldier _soldier = new Solider(); 

    public static Soldier SoldierInstance 
    { 
     get { return _soldier; } 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    MyAppManager.SoldierInstnace.surname = textbox1.text; 
} 

El primer enfoque está bien si hay una secuencia distinta para los formularios; lo último es mejor si las formas de diferencia se pueden usar en diferentes momentos o volver a visitar.

+1

Intenté con la primera solución, pero obtuve un error extraño en el constructor de Form2 (accesibilidad incoherente ...) cuando intenté agregar un parámetro (no estoy seguro porque porque parecía muy lógico). La segunda solución fue la más simple/limpia y funcionó bien. –

+0

Si la memoria le sirve, solo necesita asegurarse de que la clase para el formulario y la clase para Soldado tengan el mismo acceso. – kdmurray

+0

Ambos se enumeran como Público y sigo recibiendo el mismo error? –

3

Debería crear una propiedad pública en su formulario que exponga al soldado. A continuación, puede acceder a esta propiedad desde los otros formularios.

// ... 

public Soldier Soldier { get; private set; } 

private void button1_Click(object sender, EventArgs e) 
{ 
    Soldier tempSoldier = new Soldier(); 
    tempSoldier.surname = textbox1.Text; 

    this.Soldier = tempSoldier; 
} 

// ... 

Su clase Form2 podría ser algo como esto:

public partial class Form2 
{ 
    private Form1 form1; 

    public Form2(Form1 form1) 
    { 
    this.form1 = form1; 

    this.InitializeComponent(); 
    } 

    public void DoStuffWithForm1() 
    { 
    // ... 

    string surname = this.form1.Soldier.surname; 

    // ... 
    } 
} 
+0

Aparece el mismo mensaje de error que la respuesta anterior: "Accesibilidad incoherente: el tipo de propiedad es menos accesible que la propiedad" para la primera línea: Soldado público soldado {obtener; conjunto privado; } Entiendo que tiene que ver con los modificadores, pero cada uno aparece como Public y aun así el error sigue siendo –

+0

Error tonto ... cuando declare la clase Soldier {...} Olvidé agregar el modificador Public (olvidando que por defecto está configurado en Privado). –

0

También puede hacer Soldado una variable estática:

public static Soldier soldier {get;set;} 
private void button1_Click(object sender, EventArgs e) 
{ 
    soldier = new Soldier(); 
    soldier.surname = textbox1.text; 
} 

Código en otras formas:

Form1.soldier.name =""; 
+0

Esta parece ser la solución más elegante. –

Cuestiones relacionadas