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

时间:2014-01-23 18:19:21

标签: c# asp.net code-behind dispose

以下三个ImageButtons被添加到页面代码隐藏中的面板(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可能会产生错误或者根本不会出现。但是发生的事情是所有三个都出现并且不会导致任何错误,但事件处理程序永远不会触发已处理的ImageButtons。

为什么处理只导致事件处理程序连接消失?

我动态地将TableRow和TableCell添加到同一页面上的表中,并将ImageButtons放在每行的一个单元格中。我正在使用TableRow和TableCell的“使用”而没有任何问题。外部(TableRow& TableCell)对象被处理似乎没有问题;只要我没有处理动态ImageButtons,事件处理程序就会在点击时被解雇。

在这种情况下,是否可以不处理ImageButtons?我已经将StackOverflow的建议放在心上,并尝试在我的所有一次性物品上使用using(),所以这真的让我烦恼。

谢谢!

1 个答案:

答案 0 :(得分:1)

仅在完成所有操作后才处理对象。在处理对象后尝试对该对象执行任何操作将导致未定义的行为。把它想象成释放记忆。

幸运的是,当您关闭表单时,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()将递归清理表单上的所有组件,包括面板中的组件。