Witam. Chciałbym się dowiedzieć co robię źle, stworzyłem oddzielny plik na klasę a w nim mam dane. Z formy 2 otwieram forme 3 i w formie 3 zaznaczam sobie jakieś informacje, które później przekazuje do klasy, przy przekazywaniu sprawdzam czy rzeczywiście klasa dostała te dane i jest dobrze ale jak chce te dane wywołać w formie 2 to jest pusto. Wiecie co robię źłe? Z góry dziękuje
Tak wygląda klasa
class Dane
{
public string miejsce { get; set; }
public string potwor { get; set; }
}
W formie 3 zapisuje dane do tych stringów z klasy
Dane d = new Dane();
d.miejsce = comboBox1.Text;
d.potwor = comboBox2.Text;
W formie 2 staram się odczytać informacje, które zostały zapisane do tej klasy ale niestety są puste.
Dane w = new Dane();
System.Windows.MessageBox.Show(w.miejsce + "====" + w.potwor);
Nie bardzo to rozumiem. Chce to zrobić za pomocą klasy, gdyż zrobiłem coś takiego przez konstruktor ale to jest możliwe tylko z jedną formą z tego co widzę a mi potrzeba czegoś takiego na kilka dlatego polecili mi zrobić to klasą ale coś mi nie wychodzi. Możesz mi powiedzieć co źle zrobiłem w moim kodzie?
Operator new powoduje utworzenie nowej instancji obiektu. Nowa instancja obiektu jest umieszczona w innym miejscu w pamięci i posiada swój zestaw danych. Obiekt d i w leżą w innym miejscu w pamięci. Zmieniając zawartość jednego z nich nie zmieniasz zawartości drugiego. Wyjątkiem są statyczne pola klasy, które są wspólne dla wszystkich instancji danego obiektu.
Właśnie z programowaniem obiektowym jest u mnie problem, wszystko co robiłem, robiłem strukturalnie, stąd takie pytania banalne… Naprawdę mimo dotychczasowej pomocy nie wiem jak mam to zrobić, skoro nie mogę utworzyć nowej instancji obiektu to jak inaczej mam to zrobić? Bez operatora new otrzymuje błąd “Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.”
Jak mam zrobić aby obiekt d i w leżały w tym samym miejscu w pamięci bez używania operatora new w drugiej formie?
Nie twórz dwóch obiektów, tylko jeden. Przekleję kod z linka co podałem i dodam komentarze. Przeczytaj linia po linii, może załapiesz.
101. private void openForm3Btn(object sender, MouseEventArgs ev)
102. {
103. // jesteś w Form2 w metodzie otwierającej Form3
104. using (var form = new Form3()) // inicjujesz okienko klasy Form3
105. {
106. var result = form.ShowDialog(); // otwierasz okienko klasy Form3
107. if (result == DialogResult.OK) // w Twoim wypadku nie ważne
108. {
109. Dane mojeDane = form.daneZForm3; // patrz następny kod, skąd się wziął ten atrybut
110. System.Windows.MessageBox.Show(mojeDane.miejsce + "====" + mojeDane.potwor);
111. // coś dodać ??
112. }
113. }
114. }
private void zamknijForm3(object sender, EventArgs ev)
{
// to jest metoda w Form3, która go zamyka - dla przykładu
this.daneZForm3 = new Dane(); // inicjujesz obiekt z danymi
this.daneZForm3.miejsce = "Warszawa"; // chyba jasne
this.daneZForm3.potwor = "Tusk"; // chyba jasne
this.Close(); // zamykasz Form3 ("this" to obiekt klasy Form3, w którym jesteś)
// po zamknięciu wracasz do lini 107 z poprzedniego kodu i masz dostęp do właściwości
// "daneZForm3" wraz z jej danymi - czyli z "miejsce" i "potwor"
}
Rozumiem, że daneZForm3 to to co chce przekazać, tak? W takim wypadku chcę przekazać text z comboboxa i jest błąd " Cannot implicitly convert type ‘string’ to ‘Test.Dane’". Nie wiem czy dobrze rozumiem ale ten kod ma na otworzeniu formy3 wyświetlić informacje jakie w niej zawarte. Ja chcę zrobić aby po wciśnięciu przycisku w formie3 przekazano dane do tej klasy aby móc je bez problemu wywoływać w formie2.
@Edit
Mimo wszelkich prób nie potrafię tego zrobić, dałem to do formy3.
public string miejsce { get; set; }
public string potwor { get; set; }
Zapis do tych zmiennych
miejsce = comboBox1.Text;
potwor = comboBox2.Text;
No i właśnie przy odczytywaniu tych zmiennych muszę nadać operator new bo inaczej nie puści mnie…
Że co proszę? Albo tworzysz (dodając “new”), albo odczytujesz.
Po drugie, jeżeli Twoje kontrolki są ComboBoxami jak wskazują ich nazwy, to ich wartości nie pobiera się przez “Text”, a np. tak: http://stackoverflow.com/a/4354705