如何closureslogin表单并在不closures应用程序的情况下显示主窗体?

我在我的项目(login和主)有两种forms。

我想要的是,如果login成功,我必须显示主窗体并closureslogin窗体。

我在login表单中有这种方法,当login成功时closureslogin表单。 但主窗体不显示。

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

如果login过程成功,我试图隐藏login表单。 但它困扰我,因为我知道,而我的程序运行login表单还在那里,应该closures吧?

什么应该是正确的方法呢? 谢谢…

主窗体没有显示的原因是因为一旦closureslogin窗体,应用程序的消息泵就会closures,导致整个应用程序退出。 Windows消息循环绑定到login窗体,因为这是您在项目属性中设置为启动窗体的窗体。 看看你的“Program.cs”文件,你会看到代码的责任位: Application.Run(new LoginForm()) 。 在MSDN上查看该方法的文档,这将更详细地解释这一点。

最好的解决scheme是将代码从login表单中移出到“Program.cs”文件中。 当您的程序第一次启动时,您将创build并显示login表单作为模式对话框(它在单独的消息循环上运行,并阻止代码的其余部分执行,直到它closures)。 当login对话框closures时,您将检查其DialogResult属性以查看login是否成功。 如果是的话,你可以使用Application.Run来启动主窗体(从而创build主消息循环)。 否则,您可以退出应用程序而不显示任何表单。 像这样的东西:

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

我会反过来这样做。

在主窗体的OnLoad事件中,将login窗体显示为对话框。 如果对话结果是OK,则允许Main继续加载,如果结果是authentication失败,则中止加载并显示消息框。

编辑代码示例(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(); } } 

另一个解决scheme是从program.cs中的Main方法显示LogonForm,如下所示:

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

在这个例子中,你的LogonForm必须暴露出一个LogonSuccessful布尔属性,当用户input有效的凭据时设置为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(); } 

这是最优雅的解决scheme。

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

😉

这是一个简单的解决scheme,你的问题是当你的login表单closures时,你的整个应用程序closures了吗? 如果是这样,然后去你的项目属性,并在应用程序选项卡更改关机模式为“当最后一个表单closures”这样的方式,您可以使用Me.close而不closures整个程序

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

这是我的解决scheme。 创buildApplicationContext来设置应用程序的mainform,当你想打开新窗体并closures当前窗体时,更改mainform。

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

login过程完成后。

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

我希望这会帮助你。

我认为一个更好的方法是在Program.cs文件中执行此操作,您通常使用Application.Run(form1),这样您就可以获得更清晰的方法,Login窗体不需要耦合到Main窗体,只需显示login,如果返回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()); } 

如果我没有错,你必须在不同的线程中调用新窗体,因为windows API和COM接口的调用系统。

一个build议:这个系统是高度不安全的,因为你可以改变if条件(在MSIL中),它是一个“儿童游戏”来传递你的安全。 您需要一个更强大的系统来保护您的软件,如混淆或远程login或类似的东西。

希望这可以帮助。

你应该这样做:

首先加载mainform并在其onload事件中用showdialog()显示你的loginform ,这将阻止mainform显示,直到你得到来自loginform的结果

编辑 :因为这是一个login表单,如果你不需要从你的mainform这是实践中的糟糕的devise )的任何variables,你应该真正实现它在你的program.cs Davide和科迪build议。

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

login成功之前login成功的最佳方式,login成功之前在InitializeComponent后将login表单放入FrmMain。

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

埃文的职位太老我喜欢给你一个这样做,如果你想要显示飞溅/login屏幕,当闪屏的进度条得到一定的价值/或成功的login发生并closures飞溅/login然后重新显示主窗体,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; } 

如果你使用它的login表单

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