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

时间:2014-04-25 16:40:57

标签: c# asp.net

我有一些动态添加到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 DB填充表的方法。 已添加按钮的单击事件。

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

任何想法我可能做错了。

1 个答案:

答案 0 :(得分:3)

简而言之,您需要先在Page lifecycle之前添加 Page_Load事件。

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

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

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

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