2012-09-09 12 views
7

Przepraszam z góry, co prawdopodobnie będzie dość łatwo/szybko odpowiedzieć na podstawie zakresu, ale szukałem wszędzie i jestem zaskoczony, że nie wymyślić odpowiedź.Visual C# - Dostęp do instancji obiektu utworzonego w jednej klasie w innym

Stworzyłem klasę o nazwie Żołnierz z około 100 zmiennymi klasy. Potrzebuję użytkownika do wprowadzenia informacji i stopniowego budowania obiektu Solider w ciągu kilku różnych formularzy klasy (ponieważ jest za dużo danych do zebrania na jednym).

utworzyć (pusty) wystąpienie Żołnierza (tempSoldier) w Form1.cs i zacząć ustawić klasy zmiennych obiektu, które zbieram od użytkownika.

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

Moje pytanie: w jaki sposób mogę uzyskać dostęp do instancji obiektu (tempSoldier) od Form1.cs w innych klasach (Form2.cs, Form3.cs ...)?

Należy wspomnieć, że wszystkie formularze (Form1.cs, Form2.cs ...) mają tę samą przestrzeń nazw.

góry dzięki

Edycja: Wszystkie rozwiązania poniżej pracy, więc to po prostu zależy od tego, który z nich jak najlepiej. Dziękujemy za twoją opinię. Jedna mała uwaga, upewnij się, że wykonujesz WSZYSTKIE modyfikatory klasy Publiczne, w tym twoją niestandardową klasę (w moim przypadku Soldier.cs).

+0

Twoja lokalna deklaracja będzie miała av krótka żywotność. Jeśli zadeklarowałeś to w formie, a nie w formie w formie, możesz odwołać się do niej w innym miejscu jako "Form1.tempSoldier". – HABO

Odpowiedz

7

Będziesz musiał zadeklarować instancję Soldier w wyższym zakresie.

Jednym ze sposobów na osiągnięcie tego byłoby zadeklarować je wewnątrz Form1, a następnie przekazać je do Form2, i tak dalej.

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

Inną możliwością jest użycie zmiennej singleton w klasie, że wszystkie formy mają dostęp.

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

To pierwsze podejście jest w porządku, jeśli istnieje wyraźna sekwencja do formularzy; ta ostatnia jest lepsza, jeśli formularze różnicowe mogą być używane w różnych momentach lub ponownie odwiedzane.

+1

Wypróbowałem pierwsze rozwiązanie, ale dostałem dziwny błąd w konstruktorze Form2 (niespójna dostępność ...), gdy próbowałem dodać parametr (nie wiem dlaczego, ponieważ wydawało się bardzo logiczne). Drugie rozwiązanie było najprostsze/najczystsze i działało dobrze. –

+0

Jeśli pamięć służy, po prostu upewnij się, że klasa formularza i klasa Żołnierza mają tę samą dostępność. – kdmurray

+0

Oba są wymienione jako publiczne i nadal otrzymuję ten sam błąd? –

3

Powinieneś utworzyć w swoim formularzu publiczną własność, która naraża żołnierza. Następnie możesz uzyskać dostęp do tej właściwości z innych formularzy.

// ... 

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

// ... 

Twoja klasa Form2 mógłby wyglądać tak:

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

Otrzymuję ten sam komunikat o błędzie co poprzednia odpowiedź: "Niespójna dostępność: typ własności jest mniej dostępny niż właściwość" dla pierwszej linii: public Soldier Soldier {get; prywatny zestaw; } Rozumiem, że ma to związek z modyfikatorami, ale każdy jest wymieniony jako Publiczny, a jednak pozostaje błąd –

+0

Głupi błąd ... kiedy zadeklarowałem klasę Żołnierza {...} zapomniałem dodać modyfikatora Publicznego (zapominając że domyślnie jest ustawiony jako Prywatny). –

0

Można także żołnierzowi zmienną statyczną:

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

kod w innych formach:

Form1.soldier.name =""; 
+0

To wydaje się być najbardziej eleganckim rozwiązaniem. –

Powiązane problemy