为什么子窗体在关闭后被检测到?

时间:2019-05-09 14:59:13

标签: c# forms

我有一个子窗体,其中部分代码如下所示:

this.Close();

然后在代码的另一部分中,我寻找所有打开的子窗体以下列方式关闭它们:

foreach (Form formChildOpen in this.MdiChildren)
{
   if (!formChildOpen.Name.Equals("Sell"))
   {
      formChildOpen.Close();
   }
}

但是在调试时,在搜索打开的表单时会出现我之前关闭的表单。

我需要确定表单是否已关闭以打开它,伪代码将如下所示:

foreach (Form formChildOpen in this.MdiChildren)
{
   if (!formChildOpen.Name.Equals("Sell"))
   {
      formChildOpen.Close();
   }
   else
   {
      formChildOpen.Show();
   }
}

显然,它不能正常工作,因为在代码的其他部分,名为“ Sell”的表格没有关闭,并且在执行上述代码时,已打开的表格又打开了另一张表格。

欢迎提出任何想法或建议。

2 个答案:

答案 0 :(得分:0)

使用这些哈希集以及显示和关闭的事件,您可以跟踪哪个

窗体已打开,哪个人已关闭

    private readonly HashSet<Form> _closedForms = new HashSet<Form>();
    private readonly HashSet<Form> _openForms = new HashSet<Form>();

    private void FormOnClosed(object sender, EventArgs e)
    {
        _openForms.Remove((Form) sender);
        _closedForms.Add((Form) sender);
    }

    public void FormOnShown(object sender, EventArgs e)
    {
        _closedForms.Remove((Form)sender);
        _openForms.Add((Form)sender);
    }

但是对于foreach表单,您必须为这些事件处理程序分配

        form1.Closed += FormOnClosed;
        form1.Shown += FormOnShown;

答案 1 :(得分:0)

我们正在寻找名为Sell的表单的最佳实例来显示(如果已经可见,则使用该表单):

Form frmSell = null;
foreach (Form formChildOpen in this.MdiChildren)
{
   if (!formChildOpen.Name.Equals("Sell"))
   {
      formChildOpen.Close();
   }
   else
   {
      if (formChildOpen.Visible || frmSell == null)
          frmSell = formChildOpen;
   }
}
if (frmSell != null)
    frmSell.Show();
// else
// consider creating a new instance of form Sell here