我将一个窗体加载到 panel控件中,但是我如何关闭这个窗体呢?

时间:2022-08-30 22:36:18
我将一个窗体加载到 panel控件中,但是我如何关闭这个窗体呢?
我要在窗口的外部关闭它,不知如何做好?
再找个窗口的内部关闭它很容易,直接 this.close()就行了,但是,在窗口外部,如何通过代码关闭它呢?


        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.TopLevel = false;
            frm.Parent = panel1;
            frm.Show();
        }


以上代码就是我将一个窗口加载到 panel 控件中的代码,
我有可能随时将不同的窗体,加载到 panel中,所以要关闭已经打开的窗体。

30 个解决方案

#1


如果panel1只有一个窗体那就  ((Form)panel1.Controls[0]).Close();

#2


做个标记,明天来看看,正好需要

#3


如果已经关闭了,我再次关闭一次,就会报错,如何解决这个问题呢?
如何检测容器中,是否有加载的窗体呢?
我将一个窗体加载到 panel控件中,但是我如何关闭这个窗体呢?

#4


((Form)(panel1.Controls[0])).Close();这样写看看!

#5


可能是你加载进去的不是控件,所以应该关闭他的子窗口!

#6


引用 4 楼 a8509190 的回复:
((Form)(panel1.Controls[0])).Close();这样写看看!

我就是这样写的呀,关键是,我如何检测panel中是否已经加载了窗体了?

#7



foreach (Control con in this.panel1.Controls)
            {
                if (con is Form2)
                {
                    Form2 t = con as Form2;
                    t.Close();
                }
            }

虽然这样可以。但是应该有更好的办法。

#8


panel1.Controls.Clear();

#9


引用 3 楼 fqfqfqfq3 的回复:
如果已经关闭了,我再次关闭一次,就会报错,如何解决这个问题呢?
如何检测容器中,是否有加载的窗体呢?


//加个判断就可以
if(panel1.Controls.Count>0)
{
  ((Form)panel1.Controls[0]).Close();
}

#10


if (panel1.Controls.Count>0)
{
//判断是否加载有子控件。
}

#11


这样符合你逻辑需求部?
        private Form2 f2;

        private void button1_Click(object sender, EventArgs e)
        {
            f2 = new Form2();
            f2.TopLevel = false;
            f2.Parent = panel1;
            f2.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            f2.Close();
        }

#12


上面很多办法了也

奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...

#13


panel1.Controls.Remove(frm)

#14


引用 12 楼 rocket2010 的回复:
上面很多办法了也

奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...

窗体左边的是导航条,根据导航的不同,在右边加载不同的窗体到 panel 控件。
所以,panel 中加载的窗体的关闭,要通过左边的导航条进行控制。

#15


就是类似这种界面的效果。
我将一个窗体加载到 panel控件中,但是我如何关闭这个窗体呢?

#16


这应该是往Panel里放个自定义控件,应该不是Form。

#17


1.关闭panel里的控件 有现成的方法
2.form声明成类内 方法外变量

#18


找个地方保存当前的form,关闭后form置null,每次关闭判断form是否为null。

#19


不好意思,我想关注这贴子,顶一下。

#20


判定Panel内的窗体对象存在与否再决定是否关闭。

#21


标注关注

#22


关注下

#23


我也认为form应该作为一个成员,常驻

而且也不一定要关闭啊,可能hide()还更好,这样不用每次都重新加载。

如果form太多的话,要权衡一下了,吃内存。要设计优先关闭的,可以按打开时间顺序来调整

#24


最好的方法是放UserControl,然后删除时用Remove.
放FORM再关掉的话,要在Panel里声明一个变量,用来保存当前的窗口,如果会加载多个窗口那就用List<Form>,从外部关闭窗口后,清空变量或从List<Form>中移附对就的窗口

#25


自定义控件,而不是form

#26


使用对象之前都先判断对象存不存在是个好习惯来着啊

#27


上面不是5楼的不是可以实现了吗?  楼主

#28


关注下,回去再看了解。

#29


该回复于2011-11-15 16:23:19被版主删除

#30


主窗体类中创建UserControl全局变量

public static UserControl currentForm = new UserControl();  //全局变量,用于保存当前的视图


在视图调取按钮事件上:

            //若不存在则创建窗体
            if (currentForm.Name != "FormName")  // FormName为要加载的自定义控件的名称
            {
             if (panel1.Controls.Count > 0)
             {
                 panel1.Controls.RemoveAt(0);  //移除原有视图。此次可根据需要发挥。
                }
             currentForm = new FormMainDate();
             currentForm.Dock = System.Windows.Forms.DockStyle.Fill;
             this.panel1.Controls.Add(currentForm);
             currentForm.Show();
          }

#1


如果panel1只有一个窗体那就  ((Form)panel1.Controls[0]).Close();

#2


做个标记,明天来看看,正好需要

#3


如果已经关闭了,我再次关闭一次,就会报错,如何解决这个问题呢?
如何检测容器中,是否有加载的窗体呢?
我将一个窗体加载到 panel控件中,但是我如何关闭这个窗体呢?

#4


((Form)(panel1.Controls[0])).Close();这样写看看!

#5


可能是你加载进去的不是控件,所以应该关闭他的子窗口!

#6


引用 4 楼 a8509190 的回复:
((Form)(panel1.Controls[0])).Close();这样写看看!

我就是这样写的呀,关键是,我如何检测panel中是否已经加载了窗体了?

#7



foreach (Control con in this.panel1.Controls)
            {
                if (con is Form2)
                {
                    Form2 t = con as Form2;
                    t.Close();
                }
            }

虽然这样可以。但是应该有更好的办法。

#8


panel1.Controls.Clear();

#9


引用 3 楼 fqfqfqfq3 的回复:
如果已经关闭了,我再次关闭一次,就会报错,如何解决这个问题呢?
如何检测容器中,是否有加载的窗体呢?


//加个判断就可以
if(panel1.Controls.Count>0)
{
  ((Form)panel1.Controls[0]).Close();
}

#10


if (panel1.Controls.Count>0)
{
//判断是否加载有子控件。
}

#11


这样符合你逻辑需求部?
        private Form2 f2;

        private void button1_Click(object sender, EventArgs e)
        {
            f2 = new Form2();
            f2.TopLevel = false;
            f2.Parent = panel1;
            f2.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            f2.Close();
        }

#12


上面很多办法了也

奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...

#13


panel1.Controls.Remove(frm)

#14


引用 12 楼 rocket2010 的回复:
上面很多办法了也

奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...

窗体左边的是导航条,根据导航的不同,在右边加载不同的窗体到 panel 控件。
所以,panel 中加载的窗体的关闭,要通过左边的导航条进行控制。

#15


就是类似这种界面的效果。
我将一个窗体加载到 panel控件中,但是我如何关闭这个窗体呢?

#16


这应该是往Panel里放个自定义控件,应该不是Form。

#17


1.关闭panel里的控件 有现成的方法
2.form声明成类内 方法外变量

#18


找个地方保存当前的form,关闭后form置null,每次关闭判断form是否为null。

#19


不好意思,我想关注这贴子,顶一下。

#20


判定Panel内的窗体对象存在与否再决定是否关闭。

#21


标注关注

#22


关注下

#23


我也认为form应该作为一个成员,常驻

而且也不一定要关闭啊,可能hide()还更好,这样不用每次都重新加载。

如果form太多的话,要权衡一下了,吃内存。要设计优先关闭的,可以按打开时间顺序来调整

#24


最好的方法是放UserControl,然后删除时用Remove.
放FORM再关掉的话,要在Panel里声明一个变量,用来保存当前的窗口,如果会加载多个窗口那就用List<Form>,从外部关闭窗口后,清空变量或从List<Form>中移附对就的窗口

#25


自定义控件,而不是form

#26


使用对象之前都先判断对象存不存在是个好习惯来着啊

#27


上面不是5楼的不是可以实现了吗?  楼主

#28


关注下,回去再看了解。

#29


该回复于2011-11-15 16:23:19被版主删除

#30


主窗体类中创建UserControl全局变量

public static UserControl currentForm = new UserControl();  //全局变量,用于保存当前的视图


在视图调取按钮事件上:

            //若不存在则创建窗体
            if (currentForm.Name != "FormName")  // FormName为要加载的自定义控件的名称
            {
             if (panel1.Controls.Count > 0)
             {
                 panel1.Controls.RemoveAt(0);  //移除原有视图。此次可根据需要发挥。
                }
             currentForm = new FormMainDate();
             currentForm.Dock = System.Windows.Forms.DockStyle.Fill;
             this.panel1.Controls.Add(currentForm);
             currentForm.Show();
          }