Witam. Jak zrobić następującą rzecz. Mam główny Form , który po uruchomieniu pokazuje Form2 jako modalny. Form2 To jest okno logowania. Czyli wprowadzam nazwe usera haslo i po sprawdzeniu jeśli jest ok to zamykam okno logowania. I teraz jak zrobić aby to co wprowadzę w Form2 czyli user i password miał dostępne z poziomu Form1.? Mam klasę User, która ma pola np name, id (Te pola chce zaaktualizować jeśli będzie poprawne logowanie), . Czy dobrze będzie jak ustawie pola klasy User i ewentualne metody jako statyczne ? Bo nie muszę wtedy tworzyć obiektu typu user i z każdego miejsca mogę te pola odczytać lub zmodyfikować . Czy jest jakieś inne eleganckie rozwiązanie. Nie chodzi mi o kod tylko taki ogólny opis.
A czemu forma logowania nie może otwierać formy głównej po udanym logowaniu i przekazywać jej w konstruktorze użytkownika?
Bo chciałbym żeby program główny był uruchomiony a na nim okno logowania. i nie wpuści mnie póki nie podam danych logowania
Mylisz chyba pojęcia "program" i "okno główne". Poza tym przecież to podstawy. Otwierasz okno modalne, tak? I nie wiesz, jak zwrócić z niego parametry? Przecież to Ty wiesz, kiedy okno zniszczyć. Okno to klasa. Możesz ją wyposażyć w dodatkowe metody w stylu: GetLogin i GetPass. To nawet mogą być własności. Dopiero po pobraniu tych danych niszcz okno. Dane masz pobrać między zamknięciem okna, a zniszczeniem go, np:
Form2 f = new Form2();
f.ShowModal();
string user = f.GetUser();
string pass = f.GetPass();
f.Dispose();
Oczywiście to najprostszy przykład nie do użycia w kodzie biznesowym.
Jeszcze lepiej zrobisz, jak napiszesz sobie statyczną metodę, otwierającą to okno (w klasie tego właśnie okna) i zwracającą Ci, co podał user za pomocą argumentów ref, czy out.
@Juhas: Pewnie się pomyliłeś bo nie ma czegoś takiego jak ShowModal();
. Użyłbym jak już ShowDialog()
oraz DialogResult
. Druga sprawa to nie podoba mi się udostępnianie wrażliwych informacji poprzez publiczne metody/propertisy.
Ja bym zrobił to tak, że forma logowania po udanym logowaniu otwiera formę główną i przekazuje jej dane jakich potrzebuje przez konstruktor.
Jak mówiłem już wcześniej takie rozwiązanie odpada. Główny Form ma być widoczny a Forma logowania ma decydować o tym czy się do niego dostać czy nie. Generalnie potrafię sobie wygooglować jak przekazać dane z formy logowania do formy głównej. Ale interesuje mnie takie rozwiązanie profesjonalne :)
To tak, jak napisałem ze statyczną metodą w formie klasy logowania. I wtedy nie musisz zwracać loginu ani hasła do formy głównej, tylko info, czy udało się zalogować, czy nie.
Ale napisał że potrzebuje Usera
w formie głownej.
No, skoro potrzebuje info o zalogowanym Userze, to ma kilka możliwości. Może m.in. zwrócić go przez parametr out.
Ech, dobra podam kod, bo widzę, że nie da rady bez tego (wszystko pisane z palca):
//klasa okna do logowania
public class LoginForm: Form
{
public static bool LoginUser(out User user)
{
LoginForm f = new LoginForm();
DialogResult res = f.ShowDialog();
if(res == DialogResult.OK) //w sensie, że user wcisnął OK
{
//tu masz kilka możliwości
//możesz stworzyć usera za pomocą konkretnego konstruktora
//user = new User(/* jakieś parametry *);
//możesz pobrać całego usera z bazy np. w taki sposób
//user = DbManager.GetUserByName();
//możesz też pobrać go gdzieś podczas logowania - po wciśnięciu klawisza OK i przechować w jakimś prywatnym polu i wtedy
//user = f.mUser;
//możesz też chcieć tylko jego nazwę, którą pobierzesz z TextBoxa:
//user.Name = f.nameText.Text;
} else
user = null;
//na koniec niszczysz formę
f.Dispose();
//i zwracasz rezultat
return res == DialogResult.OK;
}
}
//wywołanie z formy głównej jest oczywiste:
User user;
if(LoginForm.LoginUser(out user))
{
//użytkownik zalogowany
} else
{
//użytkownik niezalogowany
}
Aż tak źle to nie jest żebym nie dał rady napisać. Chciałem tylko takie rozwiązanie opisowe ale dzięki za kod. Mam jakiś pogląd na to.