导航
  • 主页
  • C#互联网桌面应用
  • WinForm
  • WPF
  • 问答

请教:将窗体添加到Panel控件中遇到的问题

leon51 2020-11-24 08:54:38
在主窗体中有一个Panel控件,用户通过点击将不同的子窗体添加到Panel中。主窗体中的方法如下:
private void OpenForm(Form form)
{
panel.Controls.Clear();
form.TopLevel = false;
form.Dock = DockStyle.Fill;
form.FormBorderStyle = FormBorderStyle.None;
form.WindowState = FormWindowState.Maximized;
panel.Controls.Add(form);
form.Show();
}


每一个子窗体中都有Load等事件,
期望的效果是每次添加子窗体都要执行它的Load等事件处理程序。
但以上代码再次将同一窗体添加到Panel控件时,不会再执行Load等事件处理程序。

原以为是在添加窗体前、清除panel控件后,以前的窗体仍存在,于是在清除控件之前增加了:
foreach (Control control in panel.Controls)
{
if (control is Form f)
{
f.Dispose();
GC.Collect();
}
}

但是主窗体的代码form.Show()会出现“无法访问已释放的对象”的错误。
奇怪的是我释放的是panel中已存在的窗体而不是方法中传入的窗体form.

请问如何才能再次将同一子窗体添加到panel中时,每次都要执行子窗体中的Load等事件?谢谢
...全文
181 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2020-11-24
每次添加新的 form 实例, 而不是之前的同一个实例。
回复
wanghui0380 2020-11-24
问问题前,请先自己百度一下 https://blog.csdn.net/fengxing11/article/details/56854203 Load:在第一次显示窗体前发生 Shown:只有在首次显示窗体时才会引发 Shown 事件;随后执行的最小化、最大化、还原、隐藏、显示或无效化和重新绘制操作都不会引发该事件。 ok了,你的问题是什么??请注意“第一次” so,解决方案来了 1.他只会发生一次,那么请重新new,以保证他每次都是第一次 2.如果不想重新new,请把你的代码写到一个方法里,add的时候自己手动调用
回复
leon51 2020-11-24
希望每次将窗体添加到panel中时都执行窗体的Load事件是因为需要每次都从数据库重新给界面控件赋值
回复
韩老骥 2020-11-24
Load是第一次Show出来的时候触发的,你可以将事件方法公开出来,手工去调用。注意窗体的生存周期,点关闭的时候窗口句柄就释放了,只是托管对象还在,所以再次调用时会报错。如果想重用窗口,只能Hide,不能调用Close();
回复
OrdinaryCoder 2020-11-24
你第一个函数是传入一个form 所以这个form是已经初始化好了的 已经执行过Load当然不会执行了 不知道你具体的逻辑 最简单的是每一次都重新new一个form
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.