动态添加的按钮不触发单击事件c#

动态添加的按钮不触发单击事件c#,c#,asp.net,C#,Asp.net,我有一些正在动态添加到asp.net页面的按钮。但是,未触发onclick事件。下面是要添加的代码,它在页面加载时运行。我对ASP.NET非常陌生,所以我确信我犯了一些基本错误。蒂亚 protected void Page_Load(object sender, EventArgs e) { FillTable(); string rownum = (goalstable.Rows.Count).ToString(); Button

我有一些正在动态添加到asp.net页面的按钮。但是,未触发onclick事件。下面是要添加的代码,它在页面加载时运行。我对ASP.NET非常陌生,所以我确信我犯了一些基本错误。蒂亚

    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"); 
    }

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

简而言之,您需要在页面加载事件之前,在中的前面添加按钮

发生的情况是,对页面的每个http请求都会产生一个全新的页面对象。触发的每个事件都需要一个新的http请求。因此,当ViewButton的单击事件被触发时,您将从一个全新的页面对象和一个全新的ViewButton开始。为了使事情正常运行,使新页面具有与旧页面相同的属性,ASP.Net依赖于名为ViewState的功能。ViewState信息(通常)与来自客户端浏览器的http请求一起提交,并用于构建具有与旧页面相同控件和属性值的新页面对象

这里有一个技巧:在处理加载事件之前恢复页面的ViewState。如果在恢复ViewState时按钮还不存在,则该信息将被丢弃,并且页面稍后将不知道需要引发click事件(或者更确切地说,它将认为没有按钮可以让click事件代码首先运行)

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


在ASP.NETWebForms中使用“动态”控件时,我经常发现,只需以静态方式向页面添加合理数量的控件,并将它们全部设置为其
可见
属性为false,就更容易了。然后,在运行时,我将仅为我需要的控件将
Visible
设置回true。

简而言之,您需要在页面加载事件之前的较早时间添加按钮

发生的情况是,对页面的每个http请求都会产生一个全新的页面对象。触发的每个事件都需要一个新的http请求。因此,当ViewButton的单击事件被触发时,您将从一个全新的页面对象和一个全新的ViewButton开始。为了使事情正常运行,使新页面具有与旧页面相同的属性,ASP.Net依赖于名为ViewState的功能。ViewState信息(通常)与来自客户端浏览器的http请求一起提交,并用于构建具有与旧页面相同控件和属性值的新页面对象

这里有一个技巧:在处理加载事件之前恢复页面的ViewState。如果在恢复ViewState时按钮还不存在,则该信息将被丢弃,并且页面稍后将不知道需要引发click事件(或者更确切地说,它将认为没有按钮可以让click事件代码首先运行)

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


在ASP.NETWebForms中使用“动态”控件时,我经常发现,只需以静态方式向页面添加合理数量的控件,并将它们全部设置为其
可见
属性为false,就更容易了。然后,在运行时,我将仅为我需要的控件将
Visible
设置回true。

简而言之,您需要在页面加载事件之前的较早时间添加按钮

发生的情况是,对页面的每个http请求都会产生一个全新的页面对象。触发的每个事件都需要一个新的http请求。因此,当ViewButton的单击事件被触发时,您将从一个全新的页面对象和一个全新的ViewButton开始。为了使事情正常运行,使新页面具有与旧页面相同的属性,ASP.Net依赖于名为ViewState的功能。ViewState信息(通常)与来自客户端浏览器的http请求一起提交,并用于构建具有与旧页面相同控件和属性值的新页面对象

这里有一个技巧:在处理加载事件之前恢复页面的ViewState。如果在恢复ViewState时按钮还不存在,则该信息将被丢弃,并且页面稍后将不知道需要引发click事件(或者更确切地说,它将认为没有按钮可以让click事件代码首先运行)

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


在ASP.NETWebForms中使用“动态”控件时,我经常发现,只需以静态方式向页面添加合理数量的控件,并将它们全部设置为其
可见
属性为false,就更容易了。然后,在运行时,我将仅为我需要的控件将
Visible
设置回true。

简而言之,您需要在页面加载事件之前的较早时间添加按钮

发生的情况是,对页面的每个http请求都会产生一个全新的页面对象。触发的每个事件都需要一个新的http请求。因此,当ViewButton的单击事件被触发时,您将从一个全新的页面对象和一个全新的ViewButton开始。为了使事情正常运行,使新页面具有与旧页面相同的属性,ASP.Net依赖于名为ViewState的功能。ViewState信息(通常)与来自客户端浏览器的http请求一起提交,并用于构建具有与旧页面相同控件和属性值的新页面对象

这里有一个诀窍:视图状态为