EventHandler不适用于动态控制

我用动态链接按钮的事件处理程序引用了Error 。 它说要在Page_InitPage_Load添加事件处理程序。 我厌倦了代码。 但是,当我单击动态添加的链接按钮时,不会触发事件处理程序。 这里有什么需要纠正的?

注意:在进行一些业务validation后,会在按钮的单击事件中添加动态LinkBut​​ton控件(为简洁起见,未提供业务代码)

标记

 
Static LinkButton

代码背后

  protected void Page_Load(object sender, EventArgs e) { foreach (Control ctrl in plhDynamicLinks.Controls) { LinkButton dynamicButton = (LinkButton)ctrl; dynamicButton.Click += new EventHandler(LinkButton_Click); } if (Page.IsPostBack) { } } protected void Page_Init(object sender, EventArgs e) { int x = 0; foreach (Control ctrl in plhDynamicLinks.Controls) { LinkButton dynamicButton = (LinkButton)ctrl; dynamicButton.Click += new EventHandler(LinkButton_Click); } } protected void LinkButton_Click(object sender, EventArgs e) { LinkButton clickedControl = (LinkButton)sender; Response.Write(clickedControl.ID +" Link Button Clicked"); } protected void btnAdd_Click(object sender, EventArgs e) { plhDynamicLinks.Controls.Clear(); LinkButton button1 = new LinkButton(); button1.ID = "D1"; button1.Text = "1"; plhDynamicLinks.Controls.Add(button1); LinkButton button2 = new LinkButton(); button2.ID = "D2"; button2.Text = "2"; plhDynamicLinks.Controls.Add(button2); } 

必须在每次回发时重新创建动态控件,本文是关于如何保持动态控件及其状态的良好链接。

必须在Page_Load / Page_Init本身中注册所有必需的动态控件的事件处理程序。 在Dynamic Control的事件处理程序的工作中可以看到一个工作示例

标记

 

代码背后

  protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack) { LinkButton lnk1 = new LinkButton(); lnk1.ID = "D1"; lnk1.Text = "A"; //Event handler must be registered in the Page_Load/Page_Init lnk1.Click += new EventHandler(LinkButton_Click); plhDynamicLinks.Controls.Add(lnk1); LinkButton lnk2 = new LinkButton(); lnk2.ID = "D2"; lnk2.Text = "B"; lnk2.Click += new EventHandler(LinkButton_Click); plhDynamicLinks.Controls.Add(lnk2); LinkButton lnk3 = new LinkButton(); lnk3.ID = "D3"; lnk3.Text = "C"; lnk3.Click += new EventHandler(LinkButton_Click); plhDynamicLinks.Controls.Add(lnk3); LinkButton lnk4 = new LinkButton(); lnk4.ID = "D4"; lnk4.Text = "D"; lnk4.Click += new EventHandler(LinkButton_Click); plhDynamicLinks.Controls.Add(lnk4); } } protected void LinkButton_Click(object sender, EventArgs e) { PopulateLinksBasedOnCriteria(); LinkButton clickedControl = (LinkButton)sender; Response.Write(DateTime.Now.ToString()+"___"+ clickedControl.ID + " Link Button Clicked" ); } protected void btnAdd_Click(object sender, EventArgs e) { PopulateLinksBasedOnCriteria(); } private void PopulateLinksBasedOnCriteria() { plhDynamicLinks.Controls.Clear(); if (DateTime.Now.Second < 30) { LinkButton linkButton1 = new LinkButton(); linkButton1.ID = "D1"; linkButton1.Text = "1"; plhDynamicLinks.Controls.Add(linkButton1); LinkButton linkButton2 = new LinkButton(); linkButton2.ID = "D2"; linkButton2.Text = "2"; plhDynamicLinks.Controls.Add(linkButton2); } else { LinkButton linkButton3 = new LinkButton(); linkButton3.ID = "D3"; linkButton3.Text = "3"; plhDynamicLinks.Controls.Add(linkButton3); LinkButton linkButton4 = new LinkButton(); linkButton4.ID = "D4"; linkButton4.Text = "4"; plhDynamicLinks.Controls.Add(linkButton4); } } 

将javascript onClick属性添加到dymanic控件并设置控件事件所需的隐藏字段值。 Onclick的dymanic网格,将postback并将获得隐藏的字段值。 在页面加载中调用一个方法来执行作业,如果隐藏字段有值,并在执行作业后使其为null