web-dev-qa-db-ja.com

Visual C#-別のクラスの1つのクラスで作成されたオブジェクトのアクセスインスタンス

範囲に基づいてかなり簡単で迅速な回答になる可能性があることをあらかじめお詫びしますが、どこを見ても答えがわからないことに驚いています。

約100個のクラス変数を持つSoldierというクラスを作成しました。ユーザーが情報を入力し、いくつかの異なるクラスフォームの過程でSoliderオブジェクトを徐々に構築する必要があります(1つで収集するにはデータが多すぎるため)。

Form1.csでSoldier(tempSoldier)の(空の)インスタンスを作成し、ユーザーから収集したオブジェクトのクラス変数setを開始します。

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

私の質問:他のクラス(Form2.cs、Form3.cs ...)のForm1.csからオブジェクトインスタンス(tempSoldier)にアクセスするにはどうすればよいですか?

すべてのフォーム(Form1.cs、Form2.cs ...)が同じ名前空間を共有していることを述べておきます。

前もって感謝します

編集:以下のソリューションはすべて機能するので、どれが一番好きかによって異なります。ご意見ありがとうございます。少し注意してください。カスタムクラスを含むすべてのクラス修飾子を必ずPublicにしてください(私の場合はSoldier.cs)。

11
M. Black

より高いスコープでSoldierインスタンスを宣言する必要があります。

これを行う1つの方法は、それをForm1内で宣言し、それをForm2に渡すことです。

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

別の可能性は、すべてのフォームがアクセスできるクラスでシングルトン変数を使用することです。

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

前者のアプローチは、フォームに明確なシーケンスがある場合は問題ありません。後者は、異なる形式を異なる時間に使用したり、再検討したりできる場合に適しています。

10
McGarnagle

Soldierを静的変数にすることもできます。

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

他の形式のコード:

Form1.soldier.name ="";
4
Svexo

兵士を公開するパブリックプロパティをフォームに作成する必要があります。その後、他のフォームからこのプロパティにアクセスできます。

// ...

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

// ...

君の Form2クラスは次のようになります。

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