Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 如何从另一个MDI子窗体关闭特定MDI子窗体_C#_.net - Fatal编程技术网

C# 如何从另一个MDI子窗体关闭特定MDI子窗体

C# 如何从另一个MDI子窗体关闭特定MDI子窗体,c#,.net,C#,.net,我正在从另一个MDI子窗体打开一个MDI子窗体,它正在工作,但现在我必须以相同的方式关闭它,并且什么也没有发生 下面是我正在使用的代码示例: private void checkbox1_CheckedChanged(object sender, EventArgs e) { Form1 newForm1 = new Form1(); newForm1.MdiParent = this.MdiParent; if (checkbox1_CheckedChanged.C

我正在从另一个MDI子窗体打开一个MDI子窗体,它正在工作,但现在我必须以相同的方式关闭它,并且什么也没有发生

下面是我正在使用的代码示例:

private void checkbox1_CheckedChanged(object sender, EventArgs e)
{

    Form1 newForm1 = new Form1();
    newForm1.MdiParent = this.MdiParent;

    if (checkbox1_CheckedChanged.Checked == true)
    {
        newForm1.Show(); //this is working
    }
    else
    {
        newForm1.Dispose(); //this is not working. I have tryed .Close(), .Hide()... unsucessfully.
    }
}
解释:我在一个mdi子项中有这个复选框1,当它被选中时,另一个mdi子项(newForm1)将打开,当它被取消选中时,这个mdi子项(newForm1)将关闭、隐藏或类似的东西

有什么建议吗?
谢谢

在Form1中添加公共方法,如:

Public void closeForm()
{
  Close();
 }
在您显示的代码中,而不是

 newForm1.Dispose()
它将是:

 newForm1.closeForm();
您需要在表单集合中“查找”表单,以便处置它:

private void checkBox1_CheckedChanged(object sender, EventArgs e) {
  if (checkBox1.Checked) {
    Form1 form1 = new Form1();
    form1.MdiParent = this.MdiParent;
    form1.Show();
  } else {
    Form found = this.MdiParent.MdiChildren.Where(x => 
                 x.GetType() == typeof(Form1)).FirstOrDefault();
    if (found != null) {
      found.Dispose();
    }
  }
}
这假定集合中只有一个Form1表单


另一种方法是在check changed方法范围之外声明表单变量:

Form1 form1;

private void checkBox1_CheckedChanged(object sender, EventArgs e) {
  if (checkBox1.Checked) {
    if (form1 == null || form1.IsDisposed) {
      form1 = new Form1();
      form1.MdiParent = this.MdiParent;
      form1.Show();
    }
  } else {
    if (form1 != null) {
      form1.Dispose();
    }
  }
}

嗨,三十,这很奇怪,我认为你的解决方案应该有效,但没有什么事情像我尝试的所有其他方法那样发生。不过还是要谢谢你。老实说,我并没有试过这本书,只是直接根据记忆和经验写的,但正如你所说的@Rafael,它应该会起作用。我会打开我的笔记本电脑,因为我现在正在使用平板电脑,然后在那里试用。问题与OP的代码完全相同。这关闭了一个从未显示过的表单。@HansPassant我理解你的意思,但就“显示”本身而言,它显示了。对我的代码造成损害的是,使用他自己的代码,其中Form1在if条件之外实例化,因此每次单击复选框时都会创建一个新的Form1,正如您所说,[技术上]没有显示。LarsTech,我尝试了第二种方法,它成功了!编辑:我将使用第一个来研究你提到的表格集合。非常感谢。