Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何多次打开和关闭表单_C#_Winforms - Fatal编程技术网

C# 如何多次打开和关闭表单

C# 如何多次打开和关闭表单,c#,winforms,C#,Winforms,如何多次打开表单?我有这个活动: Form2 myForm = new Form2(); private void button_Click(object sender, EventArgs e) { myForm.Show(); } 当我用VisualStudio 2008调试我的项目时,第一次单击按钮时,表单就显示出来了,但是当我关闭它并再次尝试打开它时,我得到了一个类似的错误:无法访问已删除的对象。对象名称:“Form2” 有人能给我解释一下这种行为吗?你在哪里创建表单2 您可以

如何多次打开表单?我有这个活动:

Form2 myForm = new Form2();

private void button_Click(object sender, EventArgs e)
{
   myForm.Show();
}
当我用VisualStudio 2008调试我的项目时,第一次单击按钮时,表单就显示出来了,但是当我关闭它并再次尝试打开它时,我得到了一个类似的错误:无法访问已删除的对象。对象名称:“Form2”


有人能给我解释一下这种行为吗?

你在哪里创建
表单2

您可以使用当前表单的本地字段来保存对它的引用,例如:

private Form2 myForm2;
然后,当您想展示它时,您可以这样做:

if(myForm2 == null)
{
  myForm2 = new Form2();
}

myForm2.Show();

将第二个代码段放在Button_Click事件中,将第一个代码段放在Form1类的任意方法之外。那么它应该可以工作了。

您在哪里创建
表单2

您可以使用当前表单的本地字段来保存对它的引用,例如:

private Form2 myForm2;
然后,当您想展示它时,您可以这样做:

if(myForm2 == null)
{
  myForm2 = new Form2();
}

myForm2.Show();

将第二个代码段放在Button_Click事件中,将第一个代码段放在Form1类的任意方法之外。然后它应该可以工作。

当您关闭表单时,它被释放(并且无法再次显示),您应该创建新实例(在按钮处理程序事件中):


当您关闭表单时,它已被释放(并且无法再次显示),您应该创建新实例(在按钮处理程序事件中):


您还可以重写
Form2
事件,中断它并调用
Hide()
方法。这样,您就不必每次显示窗口时都创建新实例

编辑:
Stackoveflow上的问题示例说明了此方法。您需要做的是,在创建Form2类的原始实例时,通过向Form2类添加以下代码来连接其关闭事件:

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        Hide();
        e.Cancel = true; 
    }

就这些。您不必更改
按钮\u单击
处理程序。

您还可以重写
Form2
事件,中断它并调用
Hide()
方法。这样,您就不必每次显示窗口时都创建新实例

编辑:
Stackoveflow上的问题示例说明了此方法。您需要做的是,在创建Form2类的原始实例时,通过向Form2类添加以下代码来连接其关闭事件:

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        Hide();
        e.Cancel = true; 
    }

就这些。您不必更改
按钮\u单击处理程序。

我从任何方法外部在Form1类上创建了Form2,并将第二个片段放入按钮\u单击事件中,但它不起作用。。。我也有同样的错误…我在Form1类上从任何方法外部创建了Form2,我将第二个代码片段放入Button_Click事件中,但它不起作用。。。我也有同样的错误…如果你想重新打开表单,最好是隐藏它。如果你想重新打开表单,最好是隐藏它。为什么不直接调用
hide()
?@UrbanEsc:OP从未指定他是如何关闭
Form2
-因为有多种方法可以这样做,在一个点上处理关闭总是更好的。但是当然,你可以直接调用
Hide()
——这只是需要经历更多的场景。为什么不直接调用
Hide()
?@UrbanEsc:OP从未指定他是如何关闭
Form2
——因为有多种方法可以这样做,所以最好在一个点上处理关闭。当然,您可以直接调用
Hide()
,这只是需要经历更多的场景。