委托呼叫中断点击事件

时间:2013-01-18 23:06:20

标签: c# .net delegates

我在复杂的代码中遇到了问题。似乎委托方法调用正在中断动态添加按钮的单击事件。我没有编写一个基本的例子来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会触发委托,但不会触发它的事件处理程序。

如果我注释掉设置委托,则按钮的事件处理程序会被命中。

我知道我的代码片段不是最好的,但任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

不是最好的解决方案,但我最终删除了委托调用并直接访问基页上的方法。

if (Page is IJobEntityPage)
        {
            ((IJobEntityPage)Page).SetEditVisibility(DataItemTyped);
        }