我在一段复杂的代码中遇到了问题。似乎委托方法调用正在中断动态添加的按钮的单击事件。我还没有编写一个100%确定的基本示例,但看起来就是这样。
我们有一个包含用户控件的 .aspx 页面
<wachter:ViewEditTemplateControl ID="veSiteInfo" runat="server" Mode="View" EnableAjax="false" CanEditPermission="SiteInfoCanEdit">
<ViewButtonsTemplate>
<asp:ImageButton ID="ibMap" CommandName="Map" ImageUrl="../Images/NavIcons/map.png" Visible="true" ToolTip="Site Map" runat="server" />
<asp:ImageButton ID="ibtnSiteNotes" CommandName="SiteNotes" ImageUrl="/Images/iconInfo.png" visible="false" ToolTip="Site Notes" runat="server" />
<asp:ImageButton ID="imgEdit" CommandName="Edit" ToolTip="Edit" runat="server" ImageUrl="/Images/iconEdit.png" />
</ViewButtonsTemplate>
<ViewTemplate>
<uc1:SiteInformationView ID="SiteInformationView1" runat="server" />
</ViewTemplate>
<EditTemplate>
<uc1:SiteInformationEdit ID="SiteInformationEdit1" runat="server" />
</EditTemplate>
</wachter:ViewEditTemplateControl>
在 .aspx 的代码隐藏中,我们为 ViewTemplate 的用户控件设置了一个委托
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
(veSiteInfo.FindControl("SiteInformationView1") as JobSiteViewControl).SiteChanged += SiteChanged;
}
此委托用于设置我们的编辑按钮 imgEdit 的可见性。
ViewEditTemplateControl 在代码隐藏中包含一些代码,可动态添加保存/编辑按钮
Button btnSave = new Button();
btnSave.ID = "btnSave";
btnSave.Text = "Save";
btnSave.CommandName = "Save";
root.Controls.Add(btnSave);
Button btnCancel = new Button();
btnCancel.ID = "btnCancel";
btnCancel.Text = "Cancel";
btnCancel.CommandName = "Cancel";
btnCancel.CausesValidation = false;
root.Controls.Add(btnCancel);
在 ViewTemplate 的代码隐藏中,我们在页面初始化时调用此委托。
public Action<JobSiteEntity> SiteChanged;
public override void InitControl()
{
if (SiteChanged != null)
SiteChanged(DataItemTyped);
}
问题是单击动态添加的 btnCancel 会触发委托,但不会触发它的事件处理程序。
如果我注释掉设置委托,按钮的事件处理程序就会被命中。
我知道我的代码片段不是最好的,但任何想法都会受到赞赏。