0

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

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

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

我试着做这样的事情: 关闭一个表单,然后调用另一个

但我仍然得到相同的结果。

谢谢 :)

4

5 回答 5

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!
  }
 }
于 2012-04-12T15:37:38.283 回答
1

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

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

于 2012-04-12T15:39:20.000 回答
1

您可能希望在 Program.cs 中移动您的登录表单,而不是将其设置为启动表单。在此处查看更多信息:如何在不关闭应用程序的情况下关闭登录表单并显示主表单?

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

于 2012-04-12T15:41:49.890 回答
1

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

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

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

于 2012-04-12T16:25:38.873 回答
0

回答你的问题:它可以是任何变量。这是我编造的一个变量。它来自哪里:它实际上来自登录表单。有一个公共属性有一个私有设置器,并且只能在登录表单中设置。从我的代码中可以看出,我明白了:

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

login 是登录表单的引用。因此,我只将 strUserName 变量从登录表单“转移”到 Program(一切开始的地方)和 Form1,这样我就可以在那里显示它。 为什么我必须转移它,为什么我不能简单地从 Form1 访问它? 这是因为当代码来到 Form1 时,Login 表单已经被释放,并且来自 Login 的所有成员都设置为 null(不可访问)。你可以看到当我实例化 Login 类时,我是在 using 块中完成的,所以当代码离开它时,类也将它处理掉。

顺便说一句,登录表单如下所示:

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

希望对理解有所帮助。再见

于 2012-04-13T05:57:28.973 回答