gpt4 book ai didi

c# - 使用事件处理程序动态加载用户控件 - 注销

转载 作者:太空狗 更新时间:2023-10-29 23:03:55 29 4
gpt4 key购买 nike

我有一个带有面板的表单,我可以在该面板上动态加载多个用户控件。我处理每个控件的事件。

UserControl userControl1 = LoadControl("control.ascx") as UserControl;
userControl1.Event += new ControlEventHandler(userControl_Event);
this.Panel.Controls.Add(userControl1);

UserControl userControl2 = LoadControl("control.ascx") as UserControl;
userControl2.Event += new ControlEventHandler(userControl_Event);
this.Panel.Controls.Add(userControl2);

...

现在,当我去掉面板上的控件时,我只需做一个

this.Panel.Controls.Clear();

Clear() 函数是否负责清除事件,或者我应该做什么

foreach(Control control in this.Panel.Controls)
{
UserControl userControl = control as UserControl;
if(userControl != null)
{
userControl -= userControl_Event;
}
}

在我清除()面板的内容之前?

基本上,我正在寻找一种方法来动态加载用户控件并处理它们的事件,而不会在我删除它们时造成泄漏。

谢谢!

编辑:因为我的控件是在页面的 Page_Init 事件中创建的(每次都是动态加载的),所以说它们的生命周期不能长于页面的生命周期是否正确?据我了解,回发后控件不存在。每次都会创建一个新的。因此,我不必取消注册该事件,因为它在下一页加载时甚至不存在。对吗?

最佳答案

即使在清除集合后,页面仍将保留对动态实例化控件的引用,这将阻止在页面本身被收集之前收集控件。

在这种特殊情况下,这会很好,因为页面的生命周期很短。

但是,如果这是一个 Windows 窗体应用程序,那么在窗体被释放之前,内存实际上会被泄漏。

一般来说,当您释放事件去往的对象时取消订阅您的事件是个好主意,因为这是绝大多数 .net 内存泄漏的根源。

关于c# - 使用事件处理程序动态加载用户控件 - 注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3579087/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com