通过HtmlTextWriter呈现的动态创建的控件不会触发事件

时间:2016-04-28 14:57:50

标签: c# asp.net dynamic controls code-behind

我有一个简单的ASP.Net页面,上面有一个按钮和一个Literal Control。在按钮上单击我生成一个新的动态控件(图像按钮)并通过HtmlTextWriter将其呈现给Literal。在控件创建上,我还添加了一个未被触发的onClick事件。这是我的代码:

ASPX

    <asp:Button ID="btnCreate" runat="server" Text="Create" OnClick="btnCreate_Click" />
    <asp:Literal ID="lit" runat="server"></asp:Literal>

CS

public partial class _default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnCreate_Click(object sender, EventArgs e)
    {
        ImageButton dynBtn = new ImageButton();
        dynBtn.ID = "1";
        dynBtn.ImageUrl = "http://cdn.mysitemyway.com/etc-mysitemyway/icons/legacy-previews/icons/matte-blue-and-white-square-icons-symbols-shapes/118240-matte-blue-and-white-square-icon-symbols-shapes-power-button.png";
        dynBtn.Click += new ImageClickEventHandler(dynBtn_click);
        lit.Text = RenderControl(dynBtn);
    }

    private void dynBtn_click(object sender, ImageClickEventArgs e)
    {
        Page.Response.Write("hello!");
    }

    private string RenderControl(Control control)
    {
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter writer = new HtmlTextWriter(sw);

        control.RenderControl(writer);
        return sb.ToString();
    }
}

创建控件时没有任何错误,但事件未触发。

2 个答案:

答案 0 :(得分:0)

试试这个

completion_list = [(pair[0], pair[1]) for pair in completion_list]

答案 1 :(得分:0)

将您的ImageButton添加到ASP.NET容器将使您的生活更轻松,并且更符合框架中的操作方式。您可以将按钮添加到不同类型的Web控件,具体取决于所需的HTML容器类型。

选项1 - PlaceHolder

PlaceHolder不会呈现为HTML元素。其输出仅包含已添加到其中的控件。在这里介绍的3个容器控件中,它与Literal控件最相似。

<asp:PlaceHolder ID="container" runat="server" />

选项2 - 面板

Panel被渲染为div元素。

<asp:Panel ID="container" runat="server" />

选项3 - 标签

标签呈现为span元素。

<asp:Label ID="container" runat="server" />

添加控件

可以在代码隐藏中使用以下语句将ImageButton添加到上面提到的3种类型的ASP.NET容器中的任何一种:

container.Controls.Add(dynBtn);