开发者问题收集

向动态创建的按钮添加事件处理程序

2017-11-10
2861

我在 c# 代码隐藏中创建了一个按钮,并试图为其添加事件侦听器,但问题是如果我使用:

    {
        HtmlGenericControl dodaj = new HtmlGenericControl("button");
        dodaj.InnerText = "something";
        dodaj.Attributes.Add("runat", "server");
        dodaj.Attributes.Add("type", "submit");
        dodaj.Attributes.Add("onclick","addKosarica");
        newDivInfo.Controls.Add(dodaj);
        sadrzaj.Controls.Add(newDivInfo);
        this.Controls.Add(sadrzaj);
    }

    protected void addKosarica(object sender, EventArgs e)
    {
        Response.Redirect("www.google.com");  //just to see if it triggers
    }

我得到:

"Uncaught ReferenceError: addKosarica is not defined at HTMLButtonElement.onclick"

尝试谷歌搜索错误,它与 javascript 有关...

然后在谷歌搜索更多内容后,我尝试:

    {
        Button dodaj = new Button;
        dodaj.Text = "something";
        dodaj.Click += new EventHandler("addKosarica");
        newDivInfo.Controls.Add(dodaj);
        sadrzaj.Controls.Add(newDivInfo);
        this.Controls.Add(sadrzaj);
    }

    protected void addKosarica(object sender, EventArgs e)
    {
        Response.Redirect("www.google.com");//just to see if it triggers
    }

我得到

"Control 'ctl07' of type 'Button' must be placed inside a form tag with runat=server."

这是我的 aspx 代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="11001.aspx.cs" Inherits="_11001" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">

</asp:Content>

(它不多,因为我动态添加了所有内容,除了按钮 onclick 处理程序之外,所有内容都有效...)

请问有人可以告诉我如何使其工作...

编辑: sadrzaj 是一个包含我添加的所有元素的 div。 我将它们添加到从 Page_Load() 调用的函数中

2个回答
509326122

aspx代码

010109740
Ravi Mathpal
2017-11-10

抱歉,但您对按钮服务器端和按钮客户端之间非常困惑。

第一个问题是:为什么不在 aspx 中添加按钮?

您是否需要循环集合并创建许多类似的按钮?您可以使用 Repeater。

然后,阅读您的代码...您有一个母版页(我希望包含一个标签形式 runat="server" )。您必须将 ID 添加到要添加的控件。

在第一段代码中,您已使用

dodaj.Attributes.Add("onclick","addKosarica");
创建了 onclick 客户端(因此是 javascript)。

因此,您可以删除:

protected void addKosarica(object sender, EventArgs e)
{
   Response.Redirect("www.google.com");//just to see if it triggers
}

并在 aspx 文件中添加函数 addKosarica()。

在第二段代码中,正确的代码是:

dodaj.Click += myButton_Click;

正确的事件是

protected void myButton_Click(object sender, EventArgs e)

您可以在 Visual Studio 中自动创建 += 后两次单击选项卡

我还建议不要直接使用 this.Controls:它引用页面。您可以在 Content 标签中添加 PlaceHolder 控件或 Panel 控件,然后向其中添加控件。如果您使用 this 而不是 PanelPlaceHolder ,请尝试使用 this.Form.Controls.Add

您可以参考:

https://msdn.microsoft.com/en-us/library/kyt0fzt1.aspx

https://support.microsoft.com/en-us/help/317794/how-to-dynamically-create-controls-in-asp-net-by-using-visual-c--net

Emanuele
2017-11-10