动态(以编程方式)添加复选框和已检查的已更改事件

我以编程方式添加一些复选框和事件处理程序时遇到了一些问题。 复选框都显示正常,但点击时它们不会执行任何操作。 有谁知道我做错了什么?

我的代码:

foreach (Statement i in theseStatements) { box = new CheckBox(); box.Text = i.StatementText; box.AutoPostBack = true; box.CheckedChanged += new EventHandler(this.CheckedChange); PlaceHolder.Controls.Add(box); } protected void CheckedChange(object sender, EventArgs e) { CheckBox x = (CheckBox)sender; Instructions.Text = "change"; WorkPlaceHazardsBox.Text += x.Text; } 

您应该执行以下操作:

  1. 为您在foreach循环中创建的每个CheckBox实例设置ID属性。
  2. 对于PostBacks,确保在创建控件事件之前创建CheckBox并在页面生命周期的某个时刻附加CheckedChanged事件处理程序

请务必确认您正在执行以下操作:

  • 在初始加载和进一步回发时都添加了相同的复选框列表
  • 您为每个复选框设置了不同的ID
  • validation您是否收到回发(在页面加载中设置断点)
  • 控件将添加到Page Load页面上,甚至更好地在Page Init上

如果您尝试执行与此不同的操作,请使用更多信息更新我们。

如果每个复选框都有一个“说明”文本框和一个WorkPlaceHazards文本框,则必须有一种方法可以将单击的复选框与其他两个控件相关联。

如果情况并非如此,那么他们该做什么呢?

当你说他们“什么都不做”时 – 你得到了回传吗?

如果您必须为复选框分配ID,我不会感到惊讶 – 请记住,在回发时,您将获得一个新页面,因此它必须重新创建所有复选框,然后确定检查了哪一个这是进入什么(对我来说,无论如何)有点黑魔法的一面。 我认为你必须仔细研究页面生命周期和控制识别方面的事情。

在运行时插入控件时,可以通过Request [“controlname”]方法获取值。您必须为每个控件设置唯一ID。

但是,您可以使用CheckBoxList作为替代,而不是动态添加复选框

我将您的代码复制到一个新的VS2005 C#Web项目中(见下文)。 你的代码有效。 此代码段之外可能还有其他内容。 或者,所有语句集合中的StatementText属性是否始终为空?

页…

  
Instructions: WorkPlaceHazardsBox:

代码背后……

 using System; using System.Data; using System.Configuration; using System.Collections.Generic; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; namespace CheckboxMadness { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List statements = new List(new string[] { "foo", "bar" }); foreach (string i in statements) { CheckBox box = new CheckBox(); box.Text = i; box.AutoPostBack = true; box.CheckedChanged += new EventHandler(this.CheckedChange); PlaceHolder1.Controls.Add(box); } } protected void CheckedChange(object sender, EventArgs e) { CheckBox x = (CheckBox)sender; Instructions.Text = "change"; WorkPlaceHazardsBox.Text += x.Text; } } } 

如果嵌入在另一个控件中, CheckedChanged可能无效,例如嵌入在TableCell 。 尝试在创建外部控件之前创建CheckBox并添加CheckedChanged (例如,如果CheckBox嵌入在Table的单元格中,则Table是外部控件)。

在某些情况下,它可以解决问题。

 var box = new CheckBox();