我正在尝试创建一个简单的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#甚至远远不知道为什么。
感谢您的帮助:)
答案 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
文件
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;
}