Как закрыть форму входа и показать основную форму без закрытия моего приложения?
У меня две формы в моем проекте (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.");
}
}
Я пробовал скрывать форму входа, если процесс входа в систему успешно завершен. Но это беспокоит меня, потому что я знаю, что пока моя программа работает, форма входа еще находится там, она должна быть закрыта правильно?
Каким должен быть правильный подход?
Спасибо...
Ответы
Ответ 1
Причина, по которой ваша основная форма не отображается, заключается в том, что как только вы закрываете форму входа, ваш насос сообщений приложения отключается, что приводит к завершению всего приложения. Цикл сообщений 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();
}
}
Ответ 2
Я бы сделал это наоборот.
В событии OnLoad для вашей основной формы отобразите форму входа в систему как диалог. Если результатом этого является ОК, разрешите Main продолжить загрузку, если в результате произошел сбой аутентификации, а затем прервите загрузку и покажите окно сообщения.
ИЗМЕНИТЬ Пример кода (ов)
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, когда пользователь ввел действительные учетные данные
Ответ 3
Это просто.
Вот код.
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();
}
Ответ 4
Это самое элегантное решение.
private void buttonLogin_Click(object sender, EventArgs e)
{
MainForm mainForm = new MainForm();
this.Hide();
mainForm.ShowDialog();
this.Close();
}
; -)
Ответ 5
Здесь простое решение, ваша проблема в том, что ваше приложение закрывается, когда ваша форма входа закрывается правильно? Если это так, то перейдите к свойствам ваших проектов и на вкладке "Приложение" измените режим выключения на "Когда последняя форма закрывается" таким образом вы можете использовать Me.close без закрытия всей программы
Ответ 6
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();
}
}
Ответ 7
Это мое решение. Создайте ApplicationContext для установки основной формы приложения и изменения основной формы, когда вы хотите открыть новую форму и закрыть текущую форму.
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();
}
}
Когда процесс регистрации завершен.
private void BtLogin_Click(object sender, EventArgs e)
{
//Login Process Here.
Program.SetMainForm(new Portal());
Program.ShowMainForm();
this.Close();
}
Надеюсь, это поможет вам.
Ответ 8
вы должны сделать это наоборот:
Загрузите mainform
первым и в своем onload
событии покажите ваш loginform
с помощью showdialog()
, который предотвратит показ mainform
до тех пор, пока вы не получите результат из loginform
ИЗМЕНИТЬ:
Поскольку это форма входа в систему, и если вам не нужны какие-либо переменные из вашего mainform
(что плохо работает на практике), вы должны реально реализовать его в своей программе .cs, как предложил Давид и Коди.
Ответ 9
Я думаю, что гораздо лучший способ - сделать это в файле Program.cs, где у вас обычно есть Application.Run(form1), таким образом вы получаете более чистый подход. Форма входа не обязательно должна быть привязана к основной форме, вы просто показываете логин и, если он возвращает true, вы показываете основную форму, иначе ошибку.
Ответ 10
Попробуйте следующее:
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), и это "детская игра", чтобы передать вашу безопасность. Вам нужна более сильная система для защиты вашего программного обеспечения, например, от обфускации или удаленного входа в систему или что-то вроде этого.
Надеюсь, что это поможет.
Ответ 11
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.");
}
}
Ответ 12
лучший способ для входа в систему и закрытия формы входа перед тем, как логин успешно разместит регистрационную форму в FrmMain после InitializeComponent.
public FrmMain()
{
FrmSplash FrmSplash = new FrmSplash();
FrmSplash.ShowDialog();
InitializeComponent();
//Login Section
{
Ответ 13
Эван пост слишком стар, я хотел бы дать вам трюк, чтобы сделать это, если вы хотите показать экран всплеска/входа в систему, и когда индикатор выполнения заставки появится определенное значение/успешный вход в систему и закрыт всплеск/логин затем re показать основную форму, 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
}
}
Обратите внимание, что я использую таймер и индикатор выполнения, чтобы манипулировать действиями, в которых вам не нужны эти два, только ради полного ответа, надеюсь, что это поможет
Ответ 14
попробуйте это
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();