Dynamically (programatically) adding check boxes and checkedchanged events

走远了吗. 提交于 2019-11-30 09:03:44

问题


I am having a bit of a problem adding a few check boxes and an event handler programatically. The check boxes all appear fine, but they don't do anything when clicked. Does anyone have any idea what I am doing wrong?

My code:

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:


You should do the following:

  1. Set the ID property for each instance of CheckBox you create in your foreach loop.
  2. For PostBacks, ensure that your CheckBoxes are created and CheckedChanged event handler is attached at some point of the page life-cycle before control events are raised



回答2:


Make sure to verify you are doing the following:

  • The same list of checkbox is being added on both the initial load and further postbacks
  • You set a different ID to each checkbox
  • Verify you are getting a postback (set a break point in Page Load)
  • The controls are added to the page on Page Load, or even better on Page Init

If you are trying to do something different than that, update us with more info.




回答3:


When you say they "don't do anything" - are you getting the postback?

I wouldn't be surprised if you had to assign IDs to the checkboxes - bear in mind that on the postback, you'll get a new page, so it'll have to recreate all the checkboxes, then work out which one was checked etc. This is getting into what is (to me, anyway) somewhat black magic side of ASP.NET. I think you'll have to study the page life cycle and control identification side of things reasonably carefully.




回答4:


If you have one Instructions textbox and one WorkPlaceHazards textbox per checkbox, then you have to have a way to associate the checkbox that was clicked with those other two controls.

If that's not the case, then what are they supposed to be doing?




回答5:


You can get value by Request["controlname"] method when you inserted control in runtime.You must set Unique ID for each control.

However you can use CheckBoxList as an alternative instead of dynamically added checkboxes




回答6:


I copied your code into a new VS2005 C# web project (see below). Your code works. There may be something else going on outside of this snippet. Or, is the StatementText property in all of your statements collection always empty?

Page...

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

Code behind...

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



回答7:


CheckedChanged may not work if embedded in another control, e.g. embedded in TableCells. Have a try to create a CheckBox and add CheckedChanged before creating an outer control (e.g. Table is outer control if CheckBox is embedded in Table's cells).

It could fix the problem in some cases.




回答8:


var box = new CheckBox();


来源:https://stackoverflow.com/questions/626889/dynamically-programatically-adding-check-boxes-and-checkedchanged-events

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!