【问题标题】:Button within templated control: Event not firing模板化控件中的按钮:事件未触发
【发布时间】:2012-09-04 15:58:32
【问题描述】:

我有一个模板化控件,但在从其中触发事件时遇到问题。

我的实际控件模板比较多,稍微复杂一点,但本质就是这么简单:

<MyControl>
    <SomeTemplate>
        <%# Container.Blabla %>
        <asp:Button runat="server" id="someButton" OnClick="ClickAction" />
    </SomeTemplate>
</MyControl>

一切似乎都很好,但点击其中的按钮不会触发事件处理程序(它位于我的 page 代码隐藏中)。我在我的控制之外(或在中继器内)测试了一个按钮,效果很好。

我想这归结为所有内容的添加或数据绑定的顺序,但我看不出是什么。这是我控制的本质:

public class SomeControl : Control, INamingContainer
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateContainer(typeof(SomeTemplateContainer))]
    public ITemplate SomeTemplate { get; set; }

    public override ControlCollection Controls
    {
        get
        {
            EnsureChildControls();
            return base.Controls;
        }
    }

    protected override void CreateChildControls()
    {
        if (ChildControlsCreated)
            return;
        base.Controls.Clear();

        // Creating template containers, instantiating in controls and adding controls
        DataBind(); 
        ChildControlsCreated = true;
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        // A bunch of stuff I know work since it operates independently of my button
    }

    // Some private utility methods        
}

我错过了什么或做错了什么?

【问题讨论】:

标签: c# asp.net event-handling


【解决方案1】:

您必须在转发器的ItemCreated 事件中添加someButton.Click

var button = (Button)e.Item.FindControl("someButton") ;
button.Click += ......

【讨论】:

  • 它不是中继器,当我在中继器内部尝试时,我不必这样做。 OnClick="" 标记就足够了。另外,我试过这个。该事件已正确连接,但仍未触发。