我有一些动态添加到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");
}
任何想法我可能做错了。
答案 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,仅用于我需要的控件。