以下三个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(),所以这真的让我烦恼。
谢谢!
答案 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()将递归清理表单上的所有组件,包括面板中的组件。