动态添加的按钮没有触发点击事件c#

本文关键字:事件 添加 按钮 动态 | 更新日期: 2023-09-27 18:00:04

我有一些按钮正在动态添加到asp.net页面中。但是onclick事件没有被触发。这是添加的代码,它在页面加载时运行。我是ASP.NET的新手,所以我确信我犯了一些基本错误。TIA。

    protected void Page_Load(object sender, EventArgs e)
    {
        FillTable();
        string rownum = (goalstable.Rows.Count).ToString();
        Button bt = new Button();
        bt.Text = "View";
        bt.ID = (rownum);
        bt.CssClass = "button";
        bt.Click += Viewbutton_Click;
        goalstable.Rows[1].Cells[0].Controls.Add(bt);
    }

FillTable()是一个从SQL数据库中填充表的方法。已添加按钮的单击事件。

     protected void Viewbutton_Click(object sender, EventArgs e)
    {
        getGID();
        setGoalDets();
        goals.Style.Add("display", "block");
        darkLayer2.Style.Add("display", "block"); 
    }

知道我可能做错了什么吗。

动态添加的按钮没有触发点击事件c#

简而言之,您需要在页面生命周期的早期添加按钮,在Page_Load事件之前添加按钮。

发生的情况是,每一个服务器事件——甚至是简单的按钮点击——都是对页面的新HTTP请求。反过来,对页面的每个HTTP请求都会产生一个全新的C#页面对象。因此,当触发ViewButton的单击事件时,您将从一个全新的Page对象和一个全新ViewButton开始。

为了使事情正常工作,使新页面具有与旧页面相同的属性,ASP.Net依赖于一个名为ViewState的功能。ViewState信息(通常)与来自客户端浏览器的http请求一起提交,用于构建与旧页面对象具有相同控件和属性值的新页面对象。

诀窍是:在处理加载事件之前,会为页面恢复ViewState。如果在恢复ViewState时按钮还不存在,则该信息将被丢弃,并且页面稍后将不知道它需要引发单击事件(或者更确切地说,它将认为首先没有用于运行单击事件代码的按钮)。

因此,您需要将创建按钮的代码移动到Pre_Init事件,该事件在ViewState恢复之前运行

当使用";动态的";控件,我经常发现以静态方式向页面添加合理数量的控件并将它们全部设置为其Visible属性为false更容易。然后在运行时,我将把Visible设置回true,只用于我需要的控件。