【问题标题】:adding event handler to a dynamically created button将事件处理程序添加到动态创建的按钮
【发布时间】:2018-04-23 20:04:42
【问题描述】:

我在 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 未定义在 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
    }

我得到了

“'Button'类型的控件'ctl07'必须放在表单标签内 使用 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() 调用的函数中

【问题讨论】:

  • 您的form 标签在哪里?您的母版页上有一个吗?正如错误所说,您的按钮需要在表单标签内。
  • @CalC 表单标签在母版页中,在正文标签内

标签: c# asp.net


【解决方案1】:
protected void Page_Load(object sender, EventArgs e)
        {
            Button dodaj = new Button();
            dodaj.Text = "Click Me!";
        dodaj.Attributes.Add("runat", "server");
        dodaj.Attributes.Add("type", "submit");
        dodaj.Attributes.Add("onclick", "addKosarica");
        newDivInfo.Controls.Add(dodaj);
        dodaj.Click += Dodaj_Click1;
    }

    private void Dodaj_Click1(object sender, EventArgs e)
    {
        Response.Write("Ok");
    }

aspx 代码

<div runat="server" id="newDivInfo">

【讨论】:

  • 谢谢,这正在工作。问题是动态创建的 div 不在表单部分中(不知道为什么,在“检查元素”模式下弄明白了),但现在我找到了一种让它工作的正确方法,我设法动态地创建它! !
【解决方案2】:

抱歉,您在按钮服务器端和按钮客户端之间非常混淆。

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

您是否需要在一个集合上循环并创建许多类似的按钮?您可以使用中继器。

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

在您创建 onclick 客户端(即 javascript)的第一段代码中,使用

dodaj.Attributes.Add("onclick","addKosarica");

所以你可以删除:

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中自动创建+=之后点击tab两次

我也建议不要直接使用 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

【讨论】:

  • 好吧,我在 div 中有更多带有按钮的东西,这是让它看起来像我想要的唯一方法。我需要该函数在代码隐藏中,因为它将与数据库通信。我用你的建议尝试了第二个选项,但问题是页面甚至无法加载,它会抛出相同的“必须将'Button'类型的控件'ctl07'放在带有runat = server的表单标签内。”错误
  • 为什么不直接在aspx中呢?最常见的是:
  • 因为我在同一个 div 中有 h1、h2、标签和那个按钮。如果我在 aspx 中创建按钮,我不知道如何将它放在 h1、h2 和标签之后的 div 末尾。在我用 aspx 做的其他网站上,我使用你在评论中写的语法
  • 你可以写:

    ...

    ...

    问题出在哪里?
  • 问题是h1 h2和标签文本是从数据库加载的
猜你喜欢
相关资源
最近更新 更多
热门标签