Hug*_*ron 5 c# asp.net events user-controls event-handling
我有一个带有面板的表单,我可以动态加载多个用户控件.我为每个控件处理事件.
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);
...
Run Code Online (Sandbox Code Playgroud)
现在,当我摆脱Panel上的控件时,我只是做了一个
this.Panel.Controls.Clear();
Run Code Online (Sandbox Code Playgroud)
Clear()函数是否负责摆脱事件或我应该做什么
foreach(Control control in this.Panel.Controls)
{
UserControl userControl = control as UserControl;
if(userControl != null)
{
userControl -= userControl_Event;
}
}
Run Code Online (Sandbox Code Playgroud)
在我清除()小组的内容之前?
基本上,我正在寻找一种方法来动态加载用户控件并处理他们的事件,而不会在我摆脱它们时造成泄漏.
谢谢!
编辑: 因为我的控件是在页面的Page_Init事件中创建的(每次都是动态加载的),说它们的生命周期不能超过页面的生命周期是否正确?根据我的理解,回发后控件不存在.每次都会创建一个新的.因此,我不应该取消注册该事件,因为它在下一页加载时甚至不存在该对象.那是对的吗?
即使在清除了集合之后,该页面也将保留对动态实例化控件的引用,这将阻止在页面本身被收集之前收集控件.
在这种特殊情况下,这将很好,因为页面的生命周期很短.
但是,如果这是一个Windows窗体应用程序,那么内存将被有效泄露,直到窗体被释放.
通常,在释放事件所针对的对象时,最好取消订阅事件,因为这是绝大多数.net内存泄漏的来源.
| 归档时间: |
|
| 查看次数: |
3317 次 |
| 最近记录: |