web-dev-qa-db-fra.com

Visual C # - Accès à l'instance de l'objet créé dans une classe dans une autre

Je m'excuse à l'avance de ce qui sera probablement une réponse assez facile/rapide en fonction de la portée, mais j'ai cherché partout et je suis surpris de ne pas trouver de réponse.

J'ai créé une classe appelée Soldier avec environ 100 variables de classe. J'ai besoin d'un utilisateur pour entrer des informations et construire progressivement un objet Solider au cours de plusieurs formulaires de classe différents (car il y a trop de données à collecter sur un seul).

Je crée une instance (vide) d'un soldat (tempSoldier) dans Form1.cs et je commence à set les variables de classe de l'objet que je collecte auprès de l'utilisateur.

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

Ma question: comment puis-je accéder à l'instance d'objet (tempSoldier) à partir de Form1.cs dans les autres classes (Form2.cs, Form3.cs ...)?

Je dois mentionner que tous les formulaires (Form1.cs, Form2.cs ...) partagent le même espace de noms.

Merci d'avance

Modifier: toutes les solutions ci-dessous fonctionnent, cela dépend donc de celle que vous préférez. Merci pour votre avis. Une petite note, assurez-vous de rendre TOUS les modificateurs de classe publics, y compris votre classe personnalisée (dans mon cas, Soldier.cs).

11
M. Black

Vous devrez déclarer l'instance Soldier dans une portée plus élevée.

Une façon de le faire serait de le déclarer à l'intérieur Form1, puis de le passer à Form2, et ainsi de suite.

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 ...
    }
}

Une autre possibilité consiste à utiliser une variable singleton dans une classe à laquelle tous les formulaires ont accès.

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

La première approche est correcte s'il y a une séquence distincte dans les formulaires; ce dernier est préférable si les formulaires de différence peuvent être utilisés à des moments différents ou revus.

10
McGarnagle

Vous pouvez également faire de Soldier une variable statique:

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

Code sous d'autres formes:

Form1.soldier.name ="";
4
Svexo

Vous devez créer une propriété publique sur votre formulaire qui expose le soldat. Vous pouvez ensuite accéder à cette propriété à partir des autres formulaires.

// ...

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

// ...

Votre Form2 la classe pourrait ressembler à ceci:

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;

    // ...
  }
}
3
Dan