繁体   English   中英

处置后事件处理程序停止工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM