我在复杂的代码中遇到了问题。似乎委托方法调用正在中断动态添加按钮的单击事件。我没有编写一个基本的例子来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的usercontrol
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的代码隐藏中,我们在init页面上调用此委托。
public Action<JobSiteEntity> SiteChanged;
public override void InitControl()
{
if (SiteChanged != null)
SiteChanged(DataItemTyped);
}
问题是单击动态添加的btnCancel会触发委托,但不会触发它的事件处理程序。
如果我注释掉设置委托,则按钮的事件处理程序会被命中。
我知道我的代码片段不是最好的,但任何想法都会受到赞赏。
答案 0 :(得分:1)
不是最好的解决方案,但我最终删除了委托调用并直接访问基页上的方法。
if (Page is IJobEntityPage)
{
((IJobEntityPage)Page).SetEditVisibility(DataItemTyped);
}