Как закрыть форму входа и показать основную форму без закрытия моего приложения?

У меня две формы в моем проекте (Login и Main).

То, что я пытаюсь выполнить, заключается в том, что если вход успешно завершен, я должен показать основную форму и закрыть форму «Вход».

У меня есть этот метод в форме входа, который закрывает форму «Вход», когда логин успешно завершен. Но основная форма не показана.

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."); } } 

Я пробовал скрывать форму входа, если процесс входа в систему успешно завершен. Но это беспокоит меня, потому что я знаю, что пока моя программа работает, форма входа еще находится там, она должна быть закрыта правильно?

Каким должен быть правильный подход для этого? Благодаря…

Причина, по которой ваша основная форма не отображается, заключается в том, что после того, как вы закроете форму входа в систему, насос сообщений вашего приложения отключится, что приведет к завершению всего приложения. Цикл сообщений Windows привязан к форме входа в систему, потому что это тот, который вы задали в качестве формы запуска в своих свойствах проекта. Посмотрите в свой файл «Program.cs», и вы увидите ответственный бит кода: Application.Run(new LoginForm()) . Ознакомьтесь с документацией по этому методу здесь, на MSDN , что объясняет это более подробно.

Лучшее решение – переместить код из вашей формы входа в файл «Program.cs». Когда ваша программа запускается впервые, вы создадите и покажете форму входа в систему как модальное диалоговое окно (которое выполняется в отдельном цикле сообщений и блокирует выполнение остальной части вашего кода до его закрытия). Когда диалоговое окно входа в систему закрывается, вы проверите его свойство DialogResult чтобы узнать, был ли вход в систему успешным. Если это так, вы можете запустить основную форму с помощью Application.Run (таким образом, создав основной цикл сообщения); в противном случае вы можете выйти из приложения без какой-либо формы. Что-то вроде этого:

 static void Main() { LoginForm fLogin = new LoginForm(); if (fLogin.ShowDialog() == DialogResult.OK) { Application.Run(new MainForm()); } else { Application.Exit(); } } 

Я бы сделал это наоборот.

В событии OnLoad для вашей основной формы отобразите форму входа в систему как диалог. Если результатом этого диалога является OK, разрешите Main продолжить загрузку, если в результате произошел сбой аутентификации, а затем прервите загрузку и покажите окно сообщения.

EDIT Пример кода (ов)

 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(); } } 

Другим решением было бы показать LogonForm из метода Main в program.cs, примерно так:

 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); LogonForm logon = new LogonForm(); Application.Run(logon); if (logon.LogonSuccessful) { Application.Run(new MainForm()); } } 

В этом примере ваш LogonForm должен будет выдать свойство LogonSuccessful bool, для которого установлено значение true, когда пользователь ввел действительные учетные данные

Это просто.

Вот код.

  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(); } 

Это самое элегантное решение.

 private void buttonLogin_Click(object sender, EventArgs e) { MainForm mainForm = new MainForm(); this.Hide(); mainForm.ShowDialog(); this.Close(); } 

😉

Вот простое решение, ваша проблема в том, что ваше приложение закрывается, когда ваша форма входа закрывается правильно? Если это так, перейдите к свойствам ваших проектов и на вкладке «Приложение» измените режим выключения на «Когда последняя форма закрывается» таким образом, вы можете использовать Me.close без закрытия всей программы

 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(); } } 

Это мое решение. Создайте ApplicationContext для установки основной формы приложения и изменения основной формы, когда вы хотите открыть новую форму и закрыть текущую форму.

Program.cs

 static class Program { static ApplicationContext MainContext = new ApplicationContext(); ///  /// The main entry point for the application. ///  [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(); } } 

Когда процесс входа в систему завершен.

 private void BtLogin_Click(object sender, EventArgs e) { //Login Process Here. Program.SetMainForm(new Portal()); Program.ShowMainForm(); this.Close(); } 

Я надеюсь, что это поможет вам.

Я думаю, что гораздо лучший способ – сделать это в файле Program.cs, где у вас обычно есть Application.Run (form1), таким образом вы получаете более чистый подход. Форма входа не обязательно должна быть привязана к основной форме, вы просто показать логин, и если он вернет true, вы увидите основную форму, иначе ошибку.

Попробуй это:

 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()); } 

Вы должны называть новую форму в другой квартире, если я не ошибаюсь, из-за системы вызовов API-интерфейсов Windows и COM-интерфейсов.

Один совет: эта система очень небезопасна, потому что вы можете изменить условие if (в MSIL), и это «детская игра», чтобы передать вашу безопасность. Вам нужна более сильная система для защиты вашего программного обеспечения, например, от обфускации или удаленного входа в систему или что-то в этом роде.

Надеюсь это поможет.

вы должны сделать это наоборот:

mainform загрузите mainform и в своем событии onload покажите свою loginform showdialog() которая предотвратит mainform пока вы не получите результат из loginform

EDIT : поскольку это форма входа в систему, и если вам не нужны какие-либо переменные из вашей mainform ( что плохо работает на практике ), вы должны действительно реализовать ее в своем program.cs, как предложил Давид и Коди.

 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."); } } 

лучший способ для входа в систему и закрытия формы входа в систему до того, как логин успешно разместит регистрационную форму в FrmMain после InitializeComponent.

  public FrmMain() { FrmSplash FrmSplash = new FrmSplash(); FrmSplash.ShowDialog(); InitializeComponent(); //Login Section { 

Evan пост слишком стар, я хотел бы дать вам трюк, чтобы сделать это, если вы хотите показать экран всплеска / входа в систему, и когда индикатор выполнения заставки появится определенное значение / успешный вход в систему и закрыт всплеск / логин, основной формой, frm-main будет форма запуска, а не frm-spalash

в 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(); } } 

в 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; } 

если вы используете его для формы входа

 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 } } 

обратите внимание, что я использую таймер и индикатор выполнения, чтобы манипулировать действиями, в которых вам не нужны эти два, только ради полного ответа, надеюсь, что это поможет

попробуй это

  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); } } 

и когда вы выходите из приложения, вы можете использовать

  Application.Exit(); 
  • передавать значение из одной формы в другую
  • Список vs BindingList Преимущества / Недостатки
  • Как определить размер формы windows ACTUAL (со всеми неклиентными элементами) при запуске Aero?
  • Как я могу сделать ComboBox недоступным для редактирования в .NET?
  • Control.AddRange (...) медленный
  • Как я могу исправить приложение Windows .NET при запуске с кодом исключения: 0xE0434352?
  • Как я могу перебирать все флажки в форме?
  • Перенос слов для ярлыка в Windows Forms
  • C # Form.Close vs Form.Dispose
  • Как получить ВСЕ дочерние элементы формы формы Windows Forms определенного типа (Button / Textbox)?
  • Получить текущий путь к папке
  • Interesting Posts

    Уход за регулярными выражениями

    Почему нет replaceAll работать в этой строке кода?

    iPhone – API для функции «Текст в речь»

    Что делает «regsvr32 / i shell32.dll»?

    Объясните Моррису обход дерева без использования стеков или рекурсии

    Есть ли способ определить высоту экрана в андроиде в сантиметрах или дюймах?

    Исполнители Java: как я могу остановить отправленные задачи?

    Не удается создать раздел или найти существующий при установке окон 8.1

    ORA-01461: может связывать значение LONG только для вставки в столбцы LONG. Происходит при запросе

    Значение ‘const’ является последним в объявлении функции classа?

    Есть ли способ контролировать здоровье моего интернет-соединения?

    Как заставить многие формулы столбцов игнорировать те же строки в Excel?

    Текст Java на изображении

    Как перечислить пользователей facebook, которые любят страницу или интерес

    Мой жесткий диск не работает?

    Давайте будем гением компьютера.