繁体   English   中英

关闭C#Windows表单时出现问题

[英]Problems Closing a C# Windows Form

我在关闭C#Windows窗体应用程序时遇到问题。 当前,它只会给我一个没有标题或任何内容的空白表格。 我需要找到一种方法来关闭这个未知的小窗口。

我有2个表单页面,一个用于登录屏幕,一个用于实际应用程序。 所有这些都由program.cs文件运行。

程式

...
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new PROG1());
}

这只是Visual Studio创建的用于运行我的程序的基本主体。

然后我们有主程序

PROG1.cs

...
public PROG1()
{
    Login LoginForm = new Login();
    DialogResult a = LoginForm.ShowDialog();

    if(LoginForm.ValidLogin == 1) {
        InitializeComponent();
    } else {
        Application.Exit(); //FAIL
    }
}

您可以看到,第一个program.cs文件调用PROG1.cs,该文件调用login.cs的实例。 如果您输入有效的登录名,则登录页面将关闭,主PROG1将显示为应有的状态。 但是,如果您仅单击红色的X来关闭登录表单,它将出现在Prog1和LoginForm.ValidLogin!= 1上,因此它不会初始化该表单,而是将尝试关闭该表单。 这只会给我留下未初始化的表格,而不是将其关闭。 如果我执行this.close(),它将给我运行时错误。

有任何想法吗?

将InitializeComponent调用放回到以前的顶部。 尝试使用未初始化的变量,包括试图告诉它们关闭自身,是一个坏主意。

配置PROG1表单的属性,以便初始状态将被隐藏而不是显示。 LoginForm返回后,您的PROG1代码可以决定是显示自己还是关闭自己。

是因为InitializeComponent()方法的内容需要很长时间才能运行,所以您不对表单进行初始化的原因吗? 似乎您应该将程序简化为:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    LoginForm login = new LoginForm();

    if (login.ShowDialog() == DialogResult.OK &&
        login.ValidLogin == 1)
    Application.Run(new PROG1());
}

并从PROG1的构造函数中删除逻辑。

您不应在构造函数中执行类似的操作。

有一个新的输入表单,该表单几乎不显示或不显示任何内容,并在Load事件或主表单的Load事件中显示登录表单。 如果显示模式对话框,则他们将无法访问您的父窗体,如果他们无法登录,则可以关闭父窗体。

我会建议塞缪尔(Samuel)建议的最佳做法。 但是,如果您想快速完成操作,请尝试将登录逻辑移至Visual Studio生成的Main:

在Program.cs中

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Form2 login = new Form2();
        if (login.ShowDialog() == DialogResult.Yes)
        {
            Application.Run(new Form1());
        }
    }

在Form2.cs中

    private void button1_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.No;
        this.Close();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Yes;
        this.Close();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM