关闭一个表格并打开另一个表格

时间:2012-04-12 15:35:42

标签: c# winforms oop

我有一个Winforms应用程序,它以登录屏幕启动。如果用户的登录凭据良好,则调用此方法:

public void success()
{
    mainForm index = new mainForm();
    index.Show();
    this.Close();
}

我认为这会打开mainForm并关闭登录表单,但是当我运行它时,它会关闭整个应用程序。这是为什么?我对C#和OOP很新,所以任何提示都会受到赞赏!

我尝试过这样的事情: Closing a form and then call another one

但我仍然得到了同样的结果。

谢谢:)

5 个答案:

答案 0 :(得分:2)

这样做:

static class Program
 {
  /// <summary>
  /// The main entry point for the application.
  /// </summary>
  [STAThread]
  static void Main()
  {   
    using (Login login = new Login())
    {
     login.StartPosition = FormStartPosition.CenterScreen;
     if (login.ShowDialog() == DialogResult.OK)
     {      
      Application.Run(new Form1(login.strUserName)); //passing the userName to the constructor of form1 (see bellow)
     }
   }
  }
 }

//form1:
 public partial class Form1 : Form
 {  
  string userName; 
  public Form1(string _strUser)
  {   
   InitializeComponent();
   userName = _userName; //a local variable of a form1 class has hold user`s name (userName - which u can call it from within the form1 class!
  }
 }

答案 1 :(得分:1)

如其他问题所述,您无法关闭应用程序的主窗口(即传递给Application.Run()的窗口)。

要解决此问题,请将mainForm的实例传递给Application.Run(),并在打开时让mainForm显示登录对话框。

答案 2 :(得分:1)

您可能希望在Program.cs中移动登录表单,而不是将其设置为启动表单。点击此处:How can I close a login form and show the main form without my application closing?

另一个解决方案是在用户成功登录后隐藏登录表单并打开新表单,并在主窗口关闭时使用事件关闭登录表单(将隐藏)。

答案 3 :(得分:1)

这里的答案解释了一些解决方案,但为了澄清问题,请参阅MSDN上的Application.Run Method (Form)。它声明:

  

此方法将事件处理程序添加到Closed事件的mainForm参数。事件处理程序调用ExitThread来清理应用程序。

因此,因为您从登录框开始,一旦关闭,它就会触发ExitThread并关闭应用程序。正如我所说的,这里的其他答案说明了几种避免此问题的方法,例如直接在Main()中创建登录框或启动主窗体并让它管理显示登录框。

答案 4 :(得分:0)

回答你的问题: 它可以是任何变量。这是我编造的变量。 来自哪里:它实际上来自登录表单。公共物业有私人二手,只能在登录表格中设置。从我的代码中可以看出,我明白了:

Application.Run(new Form1(login.strUserName)); 

login是Login表单的引用。所以我只是“transfter”strUserName从登录表单变为程序(它全部开始)和Form1,所以我可以在那里显示它。 为什么我必须转移它以及为什么我不能简单地从Form1访问它? 这是因为当代码到达Form1时,已经放置了Login表单,并且Login中的所有成员都设置为null(不可访问)。你可以看到我在实例化Login类时,我是在使用block时做的,所以当代码离开它时,类也会处理它。

BTW,登录表格如下:

class Login
{
   public string strUserName { get; private set; }
}

希望它有助于理解。 再见