C# 如何关闭子窗口和所有单步子窗口

C# 如何关闭子窗口和所有单步子窗口,c#,winforms,C#,Winforms,我有一个跟踪工作时间的应用程序。非常基本。我在主winform上有一个按钮,上面写着报告。打开“报告”对话框时,会有一组按钮打开其他对话框以执行操作 我正在尝试退出“报告”对话框,同时关闭所有子窗口。如果报告对话框关闭,则报告对话框的所有子窗口都应关闭,但时间跟踪应保持打开状态。我相信这些是非模态窗口。我可以在不关闭父对话框的情况下与所有对话框进行交互 private void StartForm_Click(object sender, EventArgs e) {

我有一个跟踪工作时间的应用程序。非常基本。我在主winform上有一个按钮,上面写着报告。打开“报告”对话框时,会有一组按钮打开其他对话框以执行操作

我正在尝试退出“报告”对话框,同时关闭所有子窗口。如果报告对话框关闭,则报告对话框的所有子窗口都应关闭,但时间跟踪应保持打开状态。我相信这些是非模态窗口。我可以在不关闭父对话框的情况下与所有对话框进行交互

    private void StartForm_Click(object sender, EventArgs e)
    {
        Start f1 = new Start();
        f1.Owner = this;
        f1.Show();
    }
所以基本上我有:

MainForm>ChildForm>ManyStepChildren(??)这就是我试图关闭孩子和继子女的方式

    private void Close_Click(object sender, FormClosingEventArgs e)
    {
        this.Dispose(); //did not work
        this.Exit(); //Crashed the entire application

    }

任何人都可以为我指出正确的方向。

您正在从
报告
窗口创建所有子窗口以显示右侧?为什么不保留这些子窗口的
列表
,并在
报告
窗口的关闭事件中,遍历所有子窗口并将其全部关闭? 假设这是您的子表单

public class ChildForm: Form/Window
{
   private IList<Form/Window> _childWindows = new List<Form/Window>();

   private void ButtonClickTahWillOpenSomeChild(....)
   {
      var childWindow = new ChildWindow();
      // you might want to check if it already exists before adding in case someone clicks button twice
      _childWindows.Add(childWindow);
     // your code
   }

  // other click handlers that will open another child windows
  private void ChildForm_Close(...)
  {
      foreach(var window in _childWindows)
      {
         window.Close();
      }
      // rest of your code
  }
}
公共类子窗体:窗体/窗口
{
私有IList_childWindows=新列表();
私有无效按钮ClickTahWillopenSomeChild(..)
{
var childWindow=新的childWindow();
//在添加之前,您可能需要检查它是否已经存在,以防有人单击按钮两次
_添加(childWindow);
//你的代码
}
//将打开另一个子窗口的其他单击处理程序
私有无效子窗体关闭(…)
{
foreach(子窗口中的变量窗口)
{
window.Close();
}
//代码的其余部分
}
}

@γηρρσκω′αεπλλλδασκμε

回答得很好。非常感谢。我肯定会读到更多关于主人的信息。我可以看到它变得非常强大

根据@γηρράσκωδ'αεπολλάδασκμε,答案是将孙子对话框的所有权授予报告

    private void bSubmitTime_Click(object sender, EventArgs e)
    {
        //TrackChildForm();

        SubmitTime sf1 = new SubmitTime();
        sf1.Owner = this;
        sf1.Show();
    }
然后退出到just.Close()时。我选择了.Dispose(),因为有人告诉我这将使系统更干净一些。试图清晰地编写代码:-D

    private void Close_Click(object sender, FormClosingEventArgs e)
    {
        Form1 p = (Form1)this.Owner;
        Control[] c = p.Controls.Find("bStartForm", true);
        Button b = (Button)c[0];
        b.Enabled = true;

        this.Dispose(); 

    }

谢谢大家的回应。我真的很感激。祝你今天愉快!!:-)

只是一句愚蠢的话,但你不是指孙子孙女吗?:)@好的。对孙辈:-DIf如果关闭“子”窗口,所有孙辈/继子女将自动关闭。这个。关闭();足够了。您必须以与StartForm_Click()中相同的方式创建孙子/继子代。否。每次创建表单时,都以与为子代创建表单时相同的方式设置其所有者。您的答案肯定是跟踪正在打开的表单。谢谢你让我走了这么远。我很感激。不过,这些表格并没有关闭。等等,这很适合跟踪,但它没有关闭窗口。让我有了一个很好的主意,可以将表单名称放在内存中以供阅读。:-)谢谢@michael moore