Динамическое (программное) добавление флажков и событий CheckChanged

У меня возникла проблема с программным добавлением нескольких флажков и обработчика событий. Все флажки выглядят нормально, но при щелчке они ничего не делают. Кто-нибудь знает, что я делаю неправильно?

Мой код:

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

person Comanighttrain    schedule 09.03.2009    source источник
comment
Что такое Инструкции и что такое WorkPlaceHazardsBox? (часть кода, которую вы нам показываете, выглядит нормально)   -  person Brann    schedule 09.03.2009
comment
Инструкции — это ярлык в верхней части страницы, а WorkPlaceHazardsBox — многострочное текстовое поле в середине страницы.   -  person Comanighttrain    schedule 09.03.2009


Ответы (7)


Вы должны сделать следующее:

  1. Установите свойство ID для каждого экземпляра CheckBox, который вы создаете в цикле foreach.
  2. Для обратных сообщений убедитесь, что ваши чекбоксы созданы и CheckedChanged обработчик событий подключен в какой-то момент жизненного цикла страницы до возникновения управляющих событий.
person Ken Browning    schedule 09.03.2009
comment
Да, мои чекбоксы съедались во время обратной передачи. - person Comanighttrain; 10.03.2009

Убедитесь, что вы делаете следующее:

  • Один и тот же список флажков добавляется как при начальной загрузке, так и при последующих обратных передачах.
  • Вы устанавливаете разные идентификаторы для каждого флажка
  • Убедитесь, что вы получаете постбэк (установите точку останова в загрузке страницы)
  • Элементы управления добавляются на страницу при загрузке страницы или, что еще лучше, при инициализации страницы.

Если вы пытаетесь сделать что-то другое, сообщите нам дополнительную информацию.

person eglasius    schedule 09.03.2009

Когда вы говорите, что они "ничего не делают" - вы получаете постбэк?

Я не удивлюсь, если вам придется назначать идентификаторы для флажков - имейте в виду, что при постбэке вы получите новую страницу, поэтому ему придется пересоздать все флажки, а затем определить, какой из них был отмечен. и т. д. Это касается того, что является (во всяком случае, для меня) черной магической стороной ASP.NET. Я думаю, вам придется достаточно тщательно изучить жизненный цикл страницы и контролировать идентификацию.

person Jon Skeet    schedule 09.03.2009

Если у вас есть одно текстовое поле «Инструкции» и одно текстовое поле «WorkPlaceHazards» для каждого флажка, у вас должен быть способ связать флажок, который был нажат, с этими двумя другими элементами управления.

Если это не так, то что они должны делать?

person casperOne    schedule 09.03.2009

Вы можете получить значение с помощью метода Request["controlname"] при вставке элемента управления во время выполнения. Вы должны установить уникальный идентификатор для каждого элемента управления.

Однако вы можете использовать CheckBoxList в качестве альтернативы вместо динамически добавляемых флажков.

person Community    schedule 09.03.2009

Я скопировал ваш код в новый веб-проект VS2005 C# (см. ниже). Ваш код работает. За пределами этого фрагмента может происходить что-то еще. Или всегда ли свойство 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;
        }
    }
}
person Aaron Daniels    schedule 09.03.2009

CheckedChanged может не работать, если встроен в другой элемент управления, например. встроенный в TableCells. Попробуйте создать CheckBox и добавить CheckedChanged перед созданием внешнего элемента управления (например, таблица является внешним элементом управления, если CheckBox встроен в ячейки таблицы).

В некоторых случаях это может решить проблему.

person xcx    schedule 19.01.2017