2012-09-09 46 views
7

對於基於範圍的可能相當簡單/快速的答案,我提前表示歉意,但我向處處看了一眼,並且很驚訝沒有想出一個回答。Visual C# - 在另一個類中創建的對象的訪問實例

我創建了一個名爲的士兵類,大約有100個類變量。我需要一個用戶輸入信息,並在幾個不同的類表單上逐步構建一個對象(因爲只有一個表單上收集的數據太多)。

Form1.cs的創建士兵(tempSoldier)的(空)的實例,並開始設置我收集來自用戶對象的類變量。

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)。

+0

你當地的聲明將有AV短暫的壽命。如果你在表單中聲明它而不是表單中的方法,你可以在別處稱爲Form1.tempSoldier。 – HABO

回答

7

您需要在更高的範圍內聲明Soldier實例。這樣做會宣佈這裏面Form1中

一種方法,然後將它傳遞給窗體2,等等。

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

如果存在與表單截然不同的序列,則前一種方法是可以的;如果差異形式可以在不同的時間使用或重新審視,則後者更好。

+1

我嘗試了第一個解決方案,但當我嘗試添加一個參數(不確定爲什麼,因爲它看起來非常合乎邏輯)時,我在Form2構造函數(不一致的可訪問性...)上出現了一個奇怪的錯誤。第二種解決方案是最簡單/最乾淨的,它運行良好。 –

+0

如果內存服務,您只需確保表單的類和Soldier的類具有相同的可訪問性。 – kdmurray

+0

兩者都列爲公開,我仍然收到相同的錯誤? –

3

你應該在你的表格上公開財產以暴露士兵。您可以從其他表單訪問此屬性。

// ... 

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; 

    // ... 
    } 
} 
+0

我得到了與上一個答案相同的錯誤消息:第一行:「不一致的可訪問性:屬性類型不易訪問」: public Soldier Soldier {get;私人設置; } 我明白它與修飾符有關,但每一個都被列爲公共,但錯誤仍然存​​在 –

+0

愚蠢的錯誤......當我宣佈士兵類{...}我忘了添加Public修飾符(忘記默認情況下它被設置爲私有)。 –

0

您也可以讓士兵一個靜態變量:

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

代碼以其他形式:

Form1.soldier.name =""; 
+0

這似乎是最優雅的解決方案。 –

相關問題