如何关闭孩子和所有步骤子窗口

时间:2014-10-10 11:31:52

标签: c# winforms

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

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

    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

    }

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

2 个答案:

答案 0 :(得分:2)

@γηράσκωδ'αείπολλάδιδασκόμε

很棒的答案。谢谢。我肯定会阅读更多关于.Owner我可以看到它变得非常强大。

Per@γηράσκωδ'αείπολλάδιδασκόμε答案是将孙子对话框的所有权交给报告

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

        SubmitTime sf1 = new SubmitTime();
        sf1.Owner = this;
        sf1.Show();
    }

然后退出时只关闭.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(); 

    }

感谢大家的回复。对此,我真的非常感激。祝你有美好的一天!! : - )

答案 1 :(得分:0)

您是否正在从Report窗口创建所有子窗口以显示正确的内容?为什么不保留List这些子窗口,并在Report窗口的关闭事件中,通过所有子窗口迭代并关闭它们? 让我们说这是你的ChildForm

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
  }
}