关闭一个窗体并打开另一个窗体
本文关键字:窗体 另一个 一个 | 更新日期: 2023-09-27 18:30:49
我有一个通过登录屏幕启动的Winforms应用程序。如果用户的登录凭据良好,则调用此方法:
public void success()
{
mainForm index = new mainForm();
index.Show();
this.Close();
}
我以为这会打开mainForm
并关闭登录表单,但是当我运行它时,它会关闭整个应用程序。为什么?总的来说,我对 C# 和 OOP 很陌生,所以任何提示都值得赞赏!
我尝试做这样的事情:关闭窗体,然后调用另一个窗体
但我仍然得到了相同的结果。
谢谢:)
像这样做:
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!
}
}
如另一个问题中所述,您无法关闭应用程序的主窗口(即传递给Application.Run()
的窗口)。
要解决此问题,请将mainForm
的实例传递给Application.Run()
,并让您的mainForm
在打开时显示登录对话框。
希望在程序中移动登录表单.cs而不是将其设置为启动表单。在此处查看更多信息:如何在不关闭应用程序的情况下关闭登录表单并显示主表单?
另一种解决方案是在用户成功登录后隐藏登录表单并打开新表单,并在主窗口关闭时使用事件关闭登录表单(将被隐藏)。
此处的答案解释了一些解决方案,但若要阐明问题,请参阅 MSDN 上的 Application.Run 方法 (Form)。它指出:
因此,此方法将事件处理程序添加到 Closed 事件的 mainForm 参数中。事件处理程序调用 ExitThread 来清理应用程序。
由于您是从登录框开始的,因此一旦它关闭,它就会触发 ExitThread 并关闭应用程序。正如我所说,这里的其他答案说明了避免此问题的几种方法,例如直接在 Main() 中创建登录框或启动主窗体并让它管理显示登录框。
回答您的问题:它可以是任何变量。这是我编造的一个变量。它来自哪里:它实际上来自登录表单。有一个公共属性,它有一个私有的setter,并且只能在登录表单中设置。正如你从我的代码中看到的,我明白了:
Application.Run(new Form1(login.strUserName));
登录是登录表单的引用。所以我只从登录表单到程序(一切开始的地方)和 Form1 的"传输"strUserName varaible,所以我可以在那里显示它。为什么我必须传输它,为什么我不能简单地从 Form1 访问它?这是因为当代码来到 Form1 时,登录窗体已释放,并且登录中的所有成员都设置为 null(不可访问)。你可以看到当我实例化登录类时,我使用 block 做了它,所以当代码离开它时,类也会处理它。
顺便说一句,登录表单如下所示:
class Login
{
public string strUserName { get; private set; }
}
希望它有助于理解。再见