2012-09-04 45 views
1

我想创建一个简单的c#应用程序(我的第一次尝试在c#所以请善待)。我创建了一个带有文本框的表单来捕获一个“认证码”,然后验证这个认证码,然后一个webclient获取一个xml文件,将这个认证码传递给请求。发回的数据被解析为e.c.t.c#初始化后的第二个窗体关闭

我想要做的是一旦xml​​返回并且我做了检查以验证它是否正常。我想关闭第一个窗体并加载第二个窗体,我将以一种漂亮的格式以编程方式添加显示xml数据所需的窗体组件。

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

// close current form 
this.Close(); 

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

我敢肯定,你已经发现了现在正在犯的错误。但仅仅为了完整性陈述明显,它关闭第一种形式,打开第二种形式,然后立即退出程序(第二种形式明显闪烁一秒钟)。

我已经尝试了一些事情,但他们没有工作,使用Application.Run(new xmlViewForm());(包括替代的实例化类和使用方法show()显然你知道不工作,现在我做太多,但我不明白C#甚至远程足以明白为什么。

感谢所有帮助:)

回答

5

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

有两种可能的修复方法。首先,最简单的方法就是隐藏()你不想看到的窗体,而不是调用Close()。虽然看不见,但它仍在运行,所以应用程序不会关闭。

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

+0

谢谢基思,这正是我需要的。我正要问Sean为什么你不能关闭它,如果有一种解决方法(我目前的应用程序可以很好地隐藏它,但我可以想象更大的应用程序需要关闭主窗口来限制资源使用,除非它们使用一个空表格作为主控制器并立即隐藏)。你的解释是完美的,我讨厌知道如何修理某些东西,但不知道修理工作的原因,不让我不在哪里。 – Lee

+0

“主要形式”没有什么特别之处。它恰好通常是你入口点方法的最后一行。你可以在你的Application.Run(Form)调用之后运行额外的代码,这样说关闭表单'向应用程序发出用户想要关闭整个程序的信号'是误导性的。 – Mufaka

+0

包括OP在内的六人认为我是对的。你是唯一一个在我的答案中发现问题的人。多次调用'Application.Run()',或者在一次调用Run()之后调用除清理代码之外的任何东西都是错误的代码。假设OP没有遵循你的建议,当主窗体关闭时,消息泵到Windows将被关闭,程序将继续超出对Run()的调用,通常会立即从主方法返回,如App.Run ()是最后一行。你的回答错了。像专业一样处理它,并从中学习而不是报复。 – KeithS

4

您可以关闭主窗体后打开第二个形式。

这样做:因为它的父窗体

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

// hide current form 
this.Hide(); 

主要形式不能被关闭。如果关闭主窗体,子窗体将永远不会显示。

或编辑Program.cs文件

Application.Run(new XmlViewForm()); 

改变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; 

} 
+0

'Hide()'不关闭,只是隐藏表单。 –

+0

为什么要关闭主窗体?这是父母的形式。 @RandolfRincón-Fadul –

+0

该OP说:“我想关闭第一个表格”。现在我看到了你的编辑,+1 –