Jak mogę zamknąć formularz logowania i pokazać formularz główny bez zamykania aplikacji?
W moim projekcie mam dwie formy (Login i Main).
To, co próbuję accoomplish jest, jeśli logowanie się powiodło, muszę pokazać główny formularz i zamknąć formularz logowania.
Mam taką metodę w formularzu logowania, która zamyka formularz logowania po pomyślnym zalogowaniu. Ale główna forma się nie pokazuje.
public void ShowMain()
{
if(auth()) // a method that returns true when the user exists.
{
var main = new Main();
main.Show();
this.Close();
}
else
{
MessageBox.Show("Invalid login details.");
}
}
Próbowałem ukryć formularz logowania, jeśli proces logowania się powiódł. Ale przeszkadza mi to, bo wiem, gdy mój program jest uruchomiony formularz logowania jest nadal tam też, powinno być zamknięte, prawda?
Jakie powinno być właściwe podejście do tego? Dzięki...
14 answers
Powodem, dla którego główny formularz nie jest wyświetlany, jest to, że po zamknięciu formularza logowania pompa wiadomości aplikacji jest wyłączona, co powoduje zamknięcie całej aplikacji. Pętla Windows message loop jest powiązana z formularzem logowania, ponieważ jest to ta, którą ustawiłeś jako formularz startowy we właściwościach projektu. Zajrzyj do swojego programu.plik cs", a zobaczysz odpowiedzialny bit kodu: Application.Run(new LoginForm())
. Sprawdź dokumentację tej metody tutaj na MSDN , która wyjaśnia to w więcej szczegółów.
Najlepszym rozwiązaniem jest przeniesienie kodu z formularza logowania do "programu.plik cs. Po pierwszym uruchomieniu programu utworzysz i pokażesz formularz logowania jako okno modalne(które działa na oddzielnej pętli wiadomości i blokuje wykonywanie reszty kodu, dopóki nie zostanie on zamknięty). Po zamknięciu okna dialogowego logowania sprawdź jego właściwość DialogResult
, aby sprawdzić, czy logowanie się powiodło się. Jeśli tak, możesz uruchomić główny formularz za pomocą Application.Run
(tworząc w ten sposób główną pętlę wiadomości); w przeciwnym razie możesz zamknąć aplikację bez wyświetlania żadnego formularza. Coś takiego:
static void Main()
{
LoginForm fLogin = new LoginForm();
if (fLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}
else
{
Application.Exit();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:46:30
Zrobiłbym to na odwrót.
W zdarzeniu OnLoad dla głównego formularza Pokaż formularz logowania jako okno dialogowe. Jeśli wynik okna dialogowego jest OK, pozwól Main kontynuować ładowanie, jeśli wynikiem jest niepowodzenie uwierzytelniania, przerwij ładowanie i Pokaż okno wiadomości.
EDIT Code sample(S)
private void MainForm_Load(object sender, EventArgs e)
{
this.Hide();
LogonForm logon = new LogonForm();
if (logon.ShowDialog() != DialogResult.OK)
{
//Handle authentication failures as necessary, for example:
Application.Exit();
}
else
{
this.Show();
}
}
Innym rozwiązaniem byłoby pokazanie logowania z głównej metody w programie.cs, coś takiego:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LogonForm logon = new LogonForm();
Application.Run(logon);
if (logon.LogonSuccessful)
{
Application.Run(new MainForm());
}
}
W tym przykładzie Twój LogonForm będzie musiał ujawnić właściwość LogonSuccessful bool, która jest ustawiona na true, gdy użytkownik wprowadził poprawne poświadczenia
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:51:39
To proste.
Oto kod.
private void button1_Click(object sender, EventArgs e)
{
//creating instance of main form
MainForm mainForm = new MainForm();
// creating event handler to catch the main form closed event
// this will fire when mainForm closed
mainForm.FormClosed += new FormClosedEventHandler(mainForm_FormClosed);
//showing the main form
mainForm.Show();
//hiding the current form
this.Hide();
}
// this is the method block executes when main form is closed
void mainForm_FormClosed(object sender, FormClosedEventArgs e)
{
// here you can do anything
// we will close the application
Application.Exit();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 10:31:06
To najbardziej eleganckie rozwiązanie.
private void buttonLogin_Click(object sender, EventArgs e)
{
MainForm mainForm = new MainForm();
this.Hide();
mainForm.ShowDialog();
this.Close();
}
;-)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-10 06:13:42
Oto proste rozwiązanie, twój problem polega na tym, że cała aplikacja zamyka się po zamknięciu formularza logowania? Jeśli tak, to Przejdź do właściwości projektów i na karcie aplikacja zmień tryb zamykania na"kiedy ostatni Formularz się zamknie" w ten sposób możesz użyć mnie.Zamknij bez zamykania całego programu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-30 16:54:54
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Login();
}
private static bool logOut;
private static void Login()
{
LoginForm login = new LoginForm();
MainForm main = new MainForm();
main.FormClosed += new FormClosedEventHandler(main_FormClosed);
if (login.ShowDialog(main) == DialogResult.OK)
{
Application.Run(main);
if (logOut)
Login();
}
else
Application.Exit();
}
static void main_FormClosed(object sender, FormClosedEventArgs e)
{
logOut= (sender as MainForm).logOut;
}
}
public partial class MainForm : Form
{
private void btnLogout_ItemClick(object sender, ItemClickEventArgs e)
{
//timer1.Stop();
this.logOut= true;
this.Close();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 22:29:26
To jest moje rozwiązanie. Utwórz Applicationkontekst, aby ustawić mainform aplikacji i zmienić mainform, gdy chcesz otworzyć nowy formularz i zamknąć bieżący formularz.
Program.cs
static class Program
{
static ApplicationContext MainContext = new ApplicationContext();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainContext.MainForm = new Authenticate();
Application.Run(MainContext);
}
public static void SetMainForm(Form MainForm)
{
MainContext.MainForm = MainForm;
}
public static void ShowMainForm()
{
MainContext.MainForm.Show();
}
}
Po zakończeniu procesu logowania.
private void BtLogin_Click(object sender, EventArgs e)
{
//Login Process Here.
Program.SetMainForm(new Portal());
Program.ShowMainForm();
this.Close();
}
Mam nadzieję, że to ci pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 04:28:58
Myślę, że znacznie lepszą metodą jest zrobienie tego w programie.plik cs, w którym zwykle masz aplikację.Uruchom (form1), w ten sposób otrzymujesz czystsze podejście, formularz logowania nie musi być połączony z formularzem głównym, po prostu pokazujesz login i jeśli zwróci true wyświetlasz formularz główny, w przeciwnym razie błąd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:37:40
Spróbuj tego:
public void ShowMain()
{
if(auth()) // a method that returns true when the user exists.
{
this.Close();
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Main));
t.Start();
}
else
{
MessageBox.Show("Invalid login details.");
}
}
[STAThread]
public void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main());
}
Musisz wywołać nowy formularz w różnych wątkach, jeśli się nie mylę, ze względu na system wywołania interfejsów API i COM windows.
Jedna rada: ten system jest wysoce niepewny, ponieważ można zmienić warunek if (W MSIL) i jest to "gra dla dzieci", aby przekazać swoje bezpieczeństwo. Potrzebujesz silniejszego systemu, aby zabezpieczyć swoje oprogramowanie, takie jak zaciemnianie lub zdalne logowanie lub coś w tym stylu.
Mam nadzieję, że to pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 13:52:05
Powinieneś zrobić to odwrotnie:
Załaduj mainform
jako pierwsze i w zdarzeniu onload
pokaż swoje loginform
za pomocą showdialog()
, co uniemożliwi mainform
wyświetlanie, dopóki nie otrzymasz wyniku z loginform
{8]}
Edytuj :
Ponieważ jest to Formularz login i jeśli nie potrzebujesz żadnych zmiennych z twojego mainform
(co jest złym projektem w praktyce ), naprawdę powinieneś go zaimplementować w swoim programie.cs jak zasugerowali Davide i Cody.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-21 14:07:34
public void ShowMain()
{
if(auth()) // a method that returns true when the user exists.
{
this.Hide();
var main = new Main();
main.Show();
}
else
{
MessageBox.Show("Invalid login details.");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 16:07:47
Najlepszy sposób na wyświetlenie loginu i zamknięcie formularza logowania przed zalogowaniem pomyślnie umieść formularz logowania w FrmMain po InitializeComponent.
public FrmMain()
{
FrmSplash FrmSplash = new FrmSplash();
FrmSplash.ShowDialog();
InitializeComponent();
//Login Section
{
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-28 00:49:43
Evan post jest za stary Lubię dać ci sztuczkę, aby to zrobić, jeśli chcesz pokazać ekran splash / login i kiedy pasek postępu ekranu splash uzyskać pewną wartość / lub pomyślne logowanie się i zamknąć splash / login następnie ponownie pokazać formularz główny, FRM-main będzie formularz startowy nie FRM-spalash
In FRM-main
public partial class frmMain : Form
{
public frmMain()
{
frmSplash frm = new frmSplash();
frm.Show(); // new splash screen will shows
this.Opacity=0; // will hide your main form
InitializeComponent();
}
}
W FRM-Splash
private void timer1_Tick(object sender, EventArgs e)
{
int cnt = progressBar1.Value;
switch (cnt)
{
case 0:
//Do sum stuff
break;
case 100:
this.Close(); //close the frm-splash
frmMain.ActiveForm.Opacity = 100; // show the frm-main
break;
}
progressBar1.Value = progressBar1.Value+1;
}
Jeśli używasz go do formularza logowania
private void btlogin_Click(object sender, EventArgs e)
{
bool login = false;
//try your login here
//connect your database or whatever
//and then when it success update login variable as true
if(login == true){
this.Close(); //close the frm-login
frmMain.ActiveForm.Opacity = 100; // show the frm-main
}else{
//inform user about failed login
}
}
Zauważ, że używam timera i paska postępu do manipuluj działaniami, których nie potrzebujesz, tylko ze względu na kompletną odpowiedź, mam nadzieję, że to pomoże]}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 07:14:18
Spróbuj tego
private void cmdLogin_Click(object sender, EventArgs e)
{
if (txtUserName.Text == "admin" || txtPassword.Text == "1")
{
FrmMDI mdi = new FrmMDI();
mdi.Show();
this.Hide();
}
else {
MessageBox.Show("Incorrect Credentials", "Library Management System", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
I po wyjściu z aplikacji możesz użyć
Application.Exit();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 04:22:58