1

我正在尝试创建一个简单的 c# 应用程序(我第一次尝试 c#,所以请善待)。我创建了一个带有文本框的表单来捕获“身份验证代码”,然后对其进行验证,然后 Web 客户端获取一个 xml 文件,将此身份验证代码传递给请求。发回的数据被解析等

我想要做的是,一旦 xml 返回并且我完成了检查以使其生效,一切都很好。我想关闭第一个表单并加载第二个表单,我将在其中以编程方式添加以漂亮格式显示 xml 数据所需的表单组件。

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

// close current form
this.Close();

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

我相信你现在已经发现了我犯的错误。但只是为了完整起见,它会关闭第一个表单,打开第二个表单,然后程序立即退出(第二个表单显然会闪烁一秒钟)。

我已经尝试了一些东西,但它们都不起作用(包括使用Application.Run(new xmlViewForm());而不是实例化类和使用show()方法。显然你知道那不起作用,现在我也这样做了,尽管我对 c# 的理解不够远以至于无法工作出为什么。

谢谢你的帮助 :)

4

2 回答 2

5

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

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

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

于 2012-09-04T22:13:10.763 回答
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;

}
于 2012-09-04T22:08:13.057 回答