我很确定我知道为什么会发生这种情况,本质上是控件在页面生命周期中动态创建为时已晚,事件连线系统无法看到它,但我不确定该怎么做:
我有一个 ListView 正在为我的自定义论坛显示论坛帖子。有些帖子有附件。在 ItemDataBound 事件期间呈现附件:在 Item 的内容中搜索 asp PlaceHolder,并动态创建 ImageButton 并将其添加到占位符:
ImageButton ib_Delete = new ImageButton();
ib_Delete.ID = "ib_DeleteAttachment_" + myfile.Id.ToString();
ib_Delete.ImageUrl = "~/images/icons/delete.png";
ib_Delete.Width = 16;
ib_Delete.Height = 16;
ib_Delete.CssClass = "attachmentDeleteButton";
ib_Delete.OnClientClick = "return ConfirmDeleteAttachment();";
ib_Delete.CommandArgument = mf.Id.ToString() + '@' + m.Id;
ib_Delete.Click += new ImageClickEventHandler(DeleteMessageAttachment_Click);
myPlaceHolder.Controls.Add(ib_Delete);
现在,.cs 中的 DeleteMessageAttachment_Click 方法永远不会触发,实际上 javascript onclick 看起来像:
onclick="return ConfirmDeleteAttachment();"
实际上,我从同一个项目中的另一个页面复制了 ImageButton 创建代码,该代码没有在数据绑定相关事件中呈现 ImageButton,客户端的代码如下所示:
onclick="return ConfirmDeleteAttachment();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ctl00$cphPage$MC2$ib_DeleteAttachment_12345", "", true, "", "", false, false))"
..所以我很确定这是一个问题,因为我在页面生命周期的错误点创建了我的控件,但问题是我如何在正确的时间做到这一点?我是否应该在我的 Page_Load 中预先创建大量 ImageButton 并将它们保存在类范围的 Dictionary<> 中,以便我可以在正确的时间将它们拉出来?如果我这样做,事件连接系统会看到它们吗?只是不确定人们做了什么来确保在正确的时间创建东西以便可以在其他时间使用它。
谢谢大家