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

时间:2009-03-09 16:05:09

标签: c# asp.net event-handling

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

我的代码:

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

8 个答案:

答案 0 :(得分:3)

您应该执行以下操作:

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

答案 1 :(得分:2)

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

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

如果您尝试做的不同,请向我们提供更多信息。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

页面...

<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
        Instructions: <asp:TextBox ID="Instructions" runat="server" />
        WorkPlaceHazardsBox: <asp:TextBox ID="WorkPlaceHazardsBox" runat="server" />
    </div>
    </form>

</body>

代码背后......

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<string> statements = new List<string>(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;
        }
    }
}

答案 6 :(得分:0)

如果嵌入另一个控件中,则

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

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

答案 7 :(得分:-1)

var box = new CheckBox();