czytanie z formatki

0

Przejrzałem forum i raz był poruszony ten temat, ale w związku z tym, że nie zrozumiałem zaczynam jeszcze raz.

Mam taką sytuację, posiadam dwie formatki.
Pierwsza w której następuje logowanie i później druga która ma wyświetlać menu.

Teraz pytanie... po zalogowaniu ukrywam pierwsze menu, i otwiera się nowy Form, jak w tym drugim formie mogę przeczytać dane z pierwszego ? :/

W pierwszej formatce zadeklarowalem moja zmienna "zapytanie" jako public string.

public string zapytanie;

natomiast w drugiej formatce, po naciśnięciu guzika chciałbym, żeby mi wyświetlał na ekranie wartość "zapytanie"... próbowałem w ten sposób:

void Button1Click(object sender, System.EventArgs e)
{	
this.label1.Text = MainForm.zapytanie;
}

Zdaję sobie sprawę, że to zapewne b. proste pytanko, jednak nie potrafię sam tego rozwiązać (książka w drodze). Będę wdzięczny za uwagi co robię źle.

0

Ten temat poruszyłem na forum poświęconym technologii .NET
http://dot-net.pl/index.php?showtopic=17
<font size="1">(tak na rozruszanie towarzystwa ;))</span>

0

u mnie poskutkowało dodanie słowa

static

przed public string zapytanie

0
maly186 napisał(a)

u mnie poskutkowało dodanie słowa

static

przed public string zapytanie



dzięki pomogło oczywiście ;)
0

Ale static to nie jest raczej dobre rozwiązanie - zmienne statyczne mają tę samą wartość we wszystkich instancjach danej klasy - jeśli stworzysz nowe okno, to będzie ono współdzieliło tą zmienną.

Rzuciłeś okiem na linka?

0

Wiem, ze temat jest juz dosyc leciwy, ale z drugiej sprawy jest tez ciagle aktualny ;) a wlasnie naszla mnie pewna refleksja.

No bo zasadniczo obiekty nie powinny wiedziec zbyt duzo o sobie nawzajem, rozwiazanie ze static tez delikatnie mowiac nie jest eleganckie ani bezpieczne. I tak wymyslilem sobie zeby zastosowac wzorzec obserwatora do rozwiazania tego problemu. A wygladalo by to tak:

  • w formatce pierwszej (z ktorej chcemy cos odczytac) nalezy utworzyc zdarzenie oraz EventArga zawierajacego informacje o aktualnych wartosciach formateki i innych rzeczach ktore moga byc potrzebne.

  • po nacisnieciu jakiegos klawisz, albo innym zdarzeniu, tworzona jest formatka druga, ktora ma odpowiednia funkcje ktora mozna podpiac pod to zdarzenie - i oczywiscie funkcje ta dodajemy do zdarzenia na formatce pierszej.

W ten sposob istnieje bezpieczna mozliwosc wyslania wszystkich potrzebnych informacji za pomoca EventArg - jest to wyjscie bardzo eleganckie choc wymaga kilku linijek kodu do napisania.

Co o tym sadzicie - to chyba powinno dzialac i jest dosyc eleganckie. Moge wykonac przyklad ale to jutro lub pojutrze bo teraz jestem troszke zajety.

0

No i mialem chwile wiec przetestowalem moje rozwiazanie - dziala :)

Jak sie nalezy do tego zabrac:

po pierwsze trzeba stworzyc 2 formy

  1. Form1 zawiera textBox tbTekst oraz button btnOK
  2. Form2 zawiera tylko textBox tbOutput

W formie pierwszej tworzymy delegacje i na jej podstawie tworzymy zdarzenie

public delegate void Zdarzenie (object sender, OnZdarzenieEventArgs e);
public event Zdarzenie OnZdarzenie;

Oczywiscie potrzebne nam bedzie zdarzenie - klase zdarzenia mozna np. zagniezdzic w klasie form 1 - a jej kod to:

public class OnZdarzenieEventArgs:EventArgs
{
//ta zmienna przechowuje wartosc pola tekstowego 	
readonly string tekst;

//W momencie gdy powstaje zdarzenie tworzy sie rowniez obiekt EventArg
//w tym przypadku konstruktor ma tylko 1 parametr - wartosc pola tbTekst
	public OnZdarzenieEventArgs (string tekst)
	{
		this.tekst=tekst;
	}

//Tworzymy rowniez wlasciwosc do udostepniania tej zmiennej -
// nie jest to konieczne
// bo mozna zadeklarowac zmienna jako public ale tego nie powinno sie raczej
//robic
	public string Tekst
	{
		get
		{
			return this.tekst;
		}
	}
}

W form2 dodajemy nastepujace 2 metody

//funkcje ktora dodamy do zdarzenia OnZdarzenie - musi miec ona
//taka sygnature jak delegacja Zdarzenie
public void Tekst (object sender, Form1.OnZdarzenieEventArgs eve)
{
	tbOutput.Text=eve.Tekst;
}

//Funkcja subskrybuj informuje obiekt (przeslany w parametrze "o") ze 
//chce byc powiadomiana o zdarzeniu OnZdarzenie
public void Subskrybuj(object o)
{
	Form1 Form1_o = (Form1) o;
		Form1_o.OnZdarzenie+=newWindowsApplication1.Form1.Zdarzenie(Tekst);
}

Ostatecznie jeszcze blok wywolujacy to wszystko

private void btnOK_Click(object sender, System.EventArgs e)
{
//Tworzymy formularz form2 (obiekt) i zaczynamy sledzic czy wywolane jest zdarzenie
	Form2 form=new Form2();
	form.Subskrybuj(this);
//Jesli ktos sledzi zdarzenie OnZdarzenie to je wywolujemy
	if (OnZdarzenie!=null)
	{
		OnZdarzenieEventArgs eve = new OnZdarzenieEventArgs(tbNapis.Text);
		OnZdarzenie (this, eve);
	}

//pokazujemy form 2 ktory oczywiscie wyswietla zawartosc pola tbTekst z form1
form.Show();

}

Oczywiscie w tym przypadku to jest przerost formy nad trescia - ale takie rozwiazanie daje duzo mozliwosci - np mozna w prosty i bezpieczny sposob przekazywac wiele ustawien formularza, formularz moze byc sledzony przez kilka obiektow jednoczesnie (nie koniecznie form) itd itp

Istnieje tez prostsza wersja tego rozwiazania oparta na interfejsach. Ale jestm ciekaw co o tym sodzicie. Ja dopiero zaczynam nauke c# wiec moze to rozwiazanie ma jakies oczywiste minusy?

1 użytkowników online, w tym zalogowanych: 0, gości: 1