[英]Event Handler Stops Working After Dispose
下面的三个ImageButton在页面代码的后面添加到了面板(pBreakfast):
ImageButton ibSR = new ImageButton();
ibSR.ID = "ibStickyRoll";
ibSR.ImageUrl = "/images/Breakfast.gif";
ibSR.Click += new ImageClickEventHandler(ImageButton_Click);
pBreakfast.Controls.Add(ibSR);
ImageButton ibD = new ImageButton();
ibD.ID = "ibDoughnut";
ibD.ImageUrl = "/images/Breakfast.gif";
ibD.Click += new ImageClickEventHandler(ImageButton_Click);
pBreakfast.Controls.Add(ibD);
ibD.Dispose();
using(ImageButton ibC = new ImageButton()){
ibC.ID = "ibCrepe";
ibC.ImageUrl = "/images/Breakfast.gif";
ibC.Click += new ImageClickEventHandler(ImageButton_Click);
pBreakfast.Controls.Add(ibC);
}
我希望这三个都可以使用,或者放置的ImageButtons会产生错误或根本不会出现。 但是发生的事情是这三个都出现了,并且不会引起任何错误,但是事件处理程序永远不会为所处理的ImageButton触发。
为什么配置仅导致事件处理程序连接消失?
我正在将TableRow和TableCell动态添加到同一页上的表中,并将ImageButtons放置在每一行的一个单元格中。 我正在使用TableRow和TableCell的“使用”,没有任何问题。 外部(TableRow&TableCell)对象被处置似乎没有问题; 只要我从不丢弃动态ImageButton,事件处理程序就会在单击后被触发。
在这种情况下,永远不要丢弃ImageButtons可以吗? 我牢记了StackOverflow的建议,并尝试在所有一次性对象上使用using()-因此,这确实困扰了我。
谢谢!
仅在完全完成对象处理后再对其进行处置。 处置对象后尝试对其执行任何操作将导致不确定的行为。 将其视为释放内存。
幸运的是,Windows窗体在您关闭窗体时会为您处理这些对象。 您唯一需要在代码中处理它们的情况是从表单中删除对象。
看一下.Designer.cs文件,您将看到表单的Dispose()方法:
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
components.Dispose()将递归清除表单上的所有组件,包括面板中的组件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.