以下的代码中,点击Button1可以实现把form2嵌入到form1中的panel1中,而点击Button2先清除panel1中可能有的控件,然后将form3嵌入panel1中。但怎样才能实现模拟点击关闭panel1中的嵌入的窗体,而不是用panel1.Controls.Clear();这样仅仅是清除掉嵌入的窗体。应该如何写代码呢?谢谢!private void button1_Click(object sender, EventArgs e) //把form2嵌入form1中的panel1
        {
            Form2 aa = new Form2();
            //aa.FormBorderStyle = FormBorderStyle.None;
            aa.TopLevel = false;
            this.panel1.Controls.Add(aa);
            aa.Show();        }        
        private void button2_Click(object sender, EventArgs e)
        {
            this.panel1.Controls.Clear();
            Form3 aa2 = new Form3();
            //aa2.FormBorderStyle = FormBorderStyle.None;
            aa2.TopLevel = false;
            this.panel1.Controls.Add(aa2);
            aa2.Show();            
        }

解决方案 »

  1.   

    因为窗体正常关闭时可能有form1_Closing()、form1_Closed()之类的事件代码,如果用panel1.Controls.Clear(); 这些事件代码就无法执行了。
      

  2.   

                foreach (Control ctrl in this.panel1.Controls)
                {
                    if (ctrl is Form)
                    {
                        ctrl.Dispose();
                    }
                }
      

  3.   


            void button1_Click(object sender, EventArgs e) //把form2嵌入form1中的panel1
            {
                this.panel1.Controls.Clear();
                Form2 aa = new Form2();
                //aa.FormBorderStyle = FormBorderStyle.None;
                aa.TopLevel = false;
                this.panel1.Controls.Add(aa);
                aa.Show();            foo(aa);
            }        void button2_Click(object sender, EventArgs e)
            {
                this.panel1.Controls.Clear();
                Form3 aa2 = new Form3();
                //aa2.FormBorderStyle = FormBorderStyle.None;
                aa2.TopLevel = false;
                this.panel1.Controls.Add(aa2);
                aa2.Show();            foo(aa2);
            }        void foo(Form f)
            {
                f.ParentChanged += (sender, args) =>
                {
                    if (f.Parent == null)
                        f.Close();
                };
            }
      

  4.   

    你嵌入的窗体有名字,用Panel1.Controls.Find()找到你要的窗体,然后Panel1.Controls.RemoveByKey()