Witam mam zapewne proste pytanie lecz ja nie wiem jak go rozwiązać.
Stworzyłem formę 1 która zawiera kontroli login i hasło .
Hasło i login odczytuje z bazy danych.
Stworzyłem klasę session aby nie można było zalogować się bez poprawnego hasła i loginu.
Natomiast forma 2 to program zasadniczy.
do tego miejsca program działa poprawnie ale po zalogowaniu pozostaje widoczne okno logowania ,jeśli zamknę to okno zamyka się cały program.
Chciałbym aby po zalogowaniu okno logowania znikało /ukrywało się, czy coś w tym rodzaju czy ktoś może mi pomóc
Po pierwsze temat do bani. Problem nie leży w Visual Studio tylko w twoim programowaniu/programie. Po drugie, jaką formę wywołujesz w Program.cs
?
Temat nie do bani .
Problem oczywiście ze leży w moim programowaniu i mojej nie wiedzy , programuje 2 tygodnie .
Podałem VS 2017 aby było wiadomo jaka wersje posiadam środowiska.
Wywołuje forme2 ale ona nie jest główna , zarazem zawiera kontrolki logowania.
Cel programu to operacje na mysql (przenoszę bazę serwisową z strony http na aplikacje w celu ułatwienia pracy firmy w której pracuje).
Stąd wiem że jesteś początkujący. Z doświadczenia wiem że twój przypadek jest bardzo popularny i wersja środowiska nie ma znaczenia.
Forma która otwierasz w Program.cs
, jest dla aplikacji "główną" formą. Jeśli otwierasz Form2, która jest twoim oknem logowania i tę formę zamkniesz to cała aplikacja się wyłączy. Niestety tak działa WinForms.
Zamień formy w Program.cs
, a okno logowania wywołaj w twojej formie głównej, w konstruktorze.
Dzięki kolego,Nic się nie stało ja nawet nie mam pretensji ,nikt nie ma złotej kuli.
Ok czytałem o konstruktorach ale muszę sobie to odświeżyć jeśli mym nie dal rady podał byś przykładowe zastosowanie?
I jeszcze jedno pytanie czy to pozwoli zablokować dostęp do okna głównego do momentu wpisania hasła i ustalenia sesii jako true?
W Program.cs
ustawiasz swoje główne okno
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
Form1.cs
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Form2 frm = new Form2();
if (frm.ShowDialog() != DialogResult.OK)
{
Environment.Exit(0);
}
}
}
Logowanie Form2.cs
. Akcja przycisku "Zaloguj"
private void btnLogin_Click(object sender, EventArgs e)
{
if(dane_do_logowania_poprawne)
{
DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Niepoprawne dane do logowania");
}
}
Okno główne nie będzie widoczne póki nie zwrócisz DialogResult.Ok
. Jeśli zamkniesz okno logowania do cała aplikacja się zamknie.
Dzięki oto mi własnie się rozchodziło, a czy możesz mi to przełożyć na chłopski rozum co tu się dzieje chciałbym to zrozumieć?
Jeśli zaczynasz programowanie kompletnie, czyli nie programowałeś w niczym wcześniej, to musisz najpierw zaznajomić się z podstawami klas i obiektów. Konstruktor formy jest wywoływany przed zrenderowaniem/wyświetleniem okna. Twoje okienko Form1
będzie czekać do momentu aż nie dostanie odpowiedzi z Form2
. Odpowiedź bazuje na funkcji ShowDialog()
. Zamknięcie okna logowania tak na prawdę wysyła DialogResult.Cancel
. Stąd jeśli to odpowiednio "zaifujesz", okno główne może w ogóle się pokazać póki nie podasz poprawnych danych do logowania. Każde twoje okienko jest w stanie zwrócić DialogResult
. Moim zdaniem jest to najprostsze rozwiązanie do komunikacji pomiędzy formami.
Inny przykład.
Masz listę towarów, chcesz dodać nowy towar. Otwierasz okienko dodawania towaru, uzupełniasz dane, klikasz "Zapisz", w którym jest DialogResult.OK
, a twoje główne okienko w tym momencie wie, że faktycznie dodałeś nowy towar i może przeładować listę, aby nową pozycję wczytać. Jeśli klikniesz na "Anuluj", zwrócisz DialogResult.Cancel
i listy przeładowywać nie trzeba, ponieważ nowych danych nie ma.
PS.
Nie jestem dobry w tłumaczeniu. Tym bardziej na temat rzeczy, które dla mnie są oczywiste, ponieważ mam wrażenie, że piszę jasno i czytelnie, a okazuje się, że jest jeszcze gorzej :D
Nie wiem czy dobrze rozumiem ale żeby przenieść dane z jednego form do drugiego
Musisz stworzyć w formie do którego chcesz przenieść dane utworzyć zmienną statyczną podobną do tej:
public static TypZmiennej NazwaZmiennej {get; set;}
*"NazwaZmiennej" *oraz "TypZmiennej" to rzeczy które sam uzupełnić (typ i nazwa zmiennej w zależności od potrzeb)
Teraz daj nazwę Form'a po kropce Nazwę Zmiennej i możesz jej przypisać wartość; Kod:
NazwaForma.NazwaZmiennej = WartośćZmiennej;
Odczytanie Wartości Zmiennej
string PrzykladowaZmienna;
PrzykladowaZmienna = NazwaForma.NazwaZmiennej;
Pokazałem ci jak Zmieniać i Odczytywać Zmienne
Myślę że pomogłem
Pozdrawiam @Mondonno
:)
Mondonno-Dziek za odp to akurat udało się mi zrozumieć podczas tworzenia sesji.
AdamWox-Wszystko jasne dzięki (co do tłumaczenia bardzo zrozumiale).Co do programowanie obiektowo nie programowałem (co tam zacząłem w c+ ale zaniechałem) ,przez 15 lat pisałem softy na AVR (10lat w bascomie a resztę juz w C).Ogólnie znam w podstawie Pytona i kilka innych(potrzebnych do budowy www ale to na własne potrzeby) lecz to inna bajka jest. Dzięki za pomoc dzięki wam zrobiłem duży skok (miedzy innymi update i insert Mysql ).