【发布时间】:2010-09-08 10:06:28
【问题描述】:
我有两个窗体。现在我必须关闭第一个窗体并显示第二个窗体,反之亦然。我该怎么做。我将此指针传递给第二个窗体的构造函数,然后尝试 关闭它,但这不起作用。我不能在这里使用 showdialog。
【问题讨论】:
-
能否添加一些示例代码?
我有两个窗体。现在我必须关闭第一个窗体并显示第二个窗体,反之亦然。我该怎么做。我将此指针传递给第二个窗体的构造函数,然后尝试 关闭它,但这不起作用。我不能在这里使用 showdialog。
【问题讨论】:
在 Program 类的每个表单中添加静态变量:
static class Program
{
public static Form1 f1=null;
public static Form2 f2 = null;
public static FullClose=false;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
f1=new Form1();
f2 = new Form2();
Application.Run(f1);
}
}
然后在每个表单的Form_Closing事件中:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (Program.FullClose==false)
{
e.Cancel = true;
this.Visible = false;
Program.f2.Show();
}
}
(在 Form2 中将 Program.f2.Show() 更改为 Program.f1.Show())。
当然,这将阻止应用程序关闭,因此您应该提供一个额外的按钮(或类似按钮)来设置一个布尔静态变量 (FullClose),Form_Closing 事件可以检查它们是否应该正确关闭。
【讨论】:
你必须在你的应用程序中设置,关闭不是那么主窗体被关闭,那么如果所有窗体全部关闭。
您必须将主窗体的指针传递给第二窗体,并且主窗体必须具有第二窗体指针。
然后在您的表单中实现OnClosing 事件,然后在她的实现中打开其他表单,如果此成功返回,否则将 Cancel 设置为 true 并返回。
【讨论】:
在每种情况下,都有一种形式,它代表您的应用程序的生命。此表单将通过调用在您的Program.cs 文件中启动
Application.Run(new MyForm());
如果你试图以这种形式开始另一个,然后这会杀死他的创造者,这总是会导致一些糟糕的设计。
相反,您应该创建一些超级形式。它是不可见的,并且包含这两种形式之间的粘合代码。启动后,它会立即创建两个表单并显示第一个表单。它还以两种形式注册到(自写)事件,声称显示另一种形式。如果您的不可见表单从一个表单获取事件,它只会使发件人不可见并显示另一个表单。
最后但并非最不重要的是,您需要在两个(或至少一个)表单中进行第二个事件,这将关闭超级表单并关闭应用程序。
【讨论】: