Динамически (программно) добавление флажков и отмеченных событий - PullRequest
3 голосов
/ 09 марта 2009

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

Мой код:

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 ]

3 голосов
/ 09 марта 2009

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

  1. Установите свойство ID для каждого экземпляра CheckBox, который вы создаете в цикле foreach.
  2. Для PostBacks убедитесь, что ваши CheckBox созданы и CheckedChanged обработчик событий присоединен в некоторой точке жизненного цикла страницы до того, как события управления будут вызваны
2 голосов
/ 09 марта 2009

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

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

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

0 голосов
/ 20 января 2017

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

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

0 голосов
/ 10 марта 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;
        }
    }
}
0 голосов
/ 10 марта 2009

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

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

0 голосов
/ 09 марта 2009

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

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

0 голосов
/ 09 марта 2009
var box = new CheckBox();
0 голосов
/ 09 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...