c#初始化后关闭的第二种形式

时间:2012-09-04 22:04:57

标签: c# winforms

我正在尝试创建一个简单的c#应用程序(我第一次尝试c#所以请善待)。我创建了一个带有文本框的表单来捕获" auth代码"然后验证然后webclient获取将此身份验证代码传递给请求的xml文件。发回的数据将被解析为e.c.t。

我想要做的是,一旦xml​​回来,我已经完成了我的检查以确保它一切正常。我想关闭第一个表单并加载第二个表单,我将以编程方式添加以漂亮格式显示xml数据所需的表单组件。

我的问题是我无法让第二种形式保持开放(毫无疑问,以错误的方式调用第二种形式)。这就是我所拥有的:

// close current form
this.Close();

//open new form
xmlViewForm xmlView = new xmlViewForm();
xmlView.Show();

我确定你现在已经发现了我犯的错误。但只是为了说明完整性,它会关闭第一个表格,打开第二个表格,然后立即退出程序(第二个表格显然会闪烁一秒)。

我已经尝试了一些但没有一个能够工作(包括使用Application.Run(new xmlViewForm());而不是实例化类并使用show()方法。显然你知道它不起作用,现在我也这样做,虽然我甚至不了解c#甚至远远不知道为什么。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:5)

首先想到的是,您正在通过调用Application.Run(new MyForm())或类似内容来关闭您打开的表单。这种形式具有特殊意义;它是应用程序的“主要形式”,当关闭时,无论打开多少其他窗口,它都会向应用程序发出用户想要关闭整个程序的信号。

有两种可能的修复方法。首先,也是最简单的,只需隐藏()您不希望看到的表单,而不是在其上调用Close()。虽然看不见,但它仍在运行,因此应用程序不会关闭。

第二种解决方案是定义应该运行的自定义“应用程序上下文”,而不是通过指定要监视的主窗体创建的“默认上下文”。您可以通过从System.Windows.Forms.ApplicationContext派生自定义类来完成此操作。通过指定此上下文,您可以使用它来控制应用程序的终止,而不是关闭主窗体。可以在the MSDN page for the class找到启动两个“主要表单”并跟踪两者是否仍处于活动状态的示例代码。您可以通过为主窗体指定Load和Close处理程序来执行类似的操作,然后在主窗体实例化时将它们传递给子窗体,从而保持“打开”窗体的计数,并在该数字为时关闭整个应用程序。零。通过在childForm.Show()之前调用this.Close(),确保在关闭主表单之前加载子表单。

答案 1 :(得分:4)

关闭主表单后,您可以打开第二个表单。

这样做:

//open new form
xmlViewForm xmlView = new xmlViewForm();
xmlView.Show();

// hide current form
this.Hide();

无法关闭主窗体,因为它是父窗体。如果您关闭主表单,子表单将永远不会显示。

或者通过编辑Program.cs文件

将xmlViewForm更改为主窗体
Application.Run(new XmlViewForm());

然后您可以在加载时轻松调用另一个表单,并根据需要将其关闭:

private void XmlViewForm_Load(o, s)
{
    // hide current form, and this will remain hidden until the other form is done with it's work
    this.Hide();

    //open the other form
    TheOtherForm _theOtherForm = new TheOtherForm();
    _theOtherForm.Show();

}

private void TheOtherForm_Closed(o, s)
{
    // show current form
    this.Show;

}