1

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

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

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

4

1 回答 1

1

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

if (Page is IJobEntityPage)
        {
            ((IJobEntityPage)Page).SetEditVisibility(DataItemTyped);
        }
于 2013-01-21T16:09:59.157 回答