Всем привет.
Нужна помощь в следующей проблеме:
на aspx-странице есть кнопка (Button1), по на жатии на которкю вызывается обработчик_события_Сlick,
который добавляет на страницу динамически-создаваемые контролы (CheckBox).
при добавлении этих контролов я подписываю их событие CheckedChanged к обработчику_события_onCheck и ставлю autopostback=true.
Проблема в том, что при вызове события CheckedChanged (нажатие на флажок чекбокса) делается рефреш страницы, а обработчик не срабатывает и динамически-созданные чекбоксы опять исчезают.
Вопрос: как сделать так чтобы срабатывал обработчик события этих динамических чекбоксов.
Заранее спасибо!
код:
public partial class admin_test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void draw()
{
CheckBox newCB;
newCB = new CheckBox();
newCB.InputAttributes.Add("value", "somevalue");
newCB.AutoPostBack = true;
newCB.Text = "unchecked";
newCB.CheckedChanged += new EventHandler(onCheck);
form1.Controls.Add(newCB);
}
protected void onCheck(object sender, EventArgs e)
{
CheckBox cbx = (CheckBox)sender;
cbx.Text = "checked";
}
protected void Button1_Click(object sender, EventArgs e)
{
draw();
}
}
Здравствуйте, Romashkin, Вы писали:
R>Проблема в том, что при вызове события CheckedChanged (нажатие на флажок чекбокса) делается рефреш страницы, а обработчик не срабатывает и динамически-созданные чекбоксы опять исчезают.
Проблема в том, что при рефреше контролов, события которых должны были сработать, просто нет. Ты ведь их не добавил.
R>Вопрос: как сделать так чтобы срабатывал обработчик события этих динамических чекбоксов.
Запоминай (как думай сам), какие контролы ты насоздавал, и при рефреше создавай их заново.
... << RSDN@Home 1.2.0 alpha rev. 668>>
Спасибо, RustM.
RM>Запоминай (как думай сам), какие контролы ты насоздавал, и при рефреше создавай их заново.
а какие способы запоминания существуют? просто чекбоксы генерируются на основе данных базы данных, и не хочется каждый раз на Page_Load подключаться к базе данных зря..
Здравствуйте, Romashkin, Вы писали:
R>Спасибо, RustM.
RM>>Запоминай (как думай сам), какие контролы ты насоздавал, и при рефреше создавай их заново.
R>а какие способы запоминания существуют? просто чекбоксы генерируются на основе данных базы данных, и не хочется каждый раз на Page_Load подключаться к базе данных зря..
Можно создать, например, массив в котором хранить ID из базы и положить в стэйт (State). А в Page_Load брать из стэйта и формировать контролы, при этом коннектится к базы не надо. Можно создать ArrayList и хранить объекты со всеми нужными данными для добавления чекбокса (ID, label, etc) в стэйте. Тут широкое поле для творчества и деятельности. Подробнее про стэйты в ASP.Net в MSDN
здесь.
Насколько я понимаю то, что вы пытаетесь сделать сделать нельзя. Причина? Вы создаете динамические объекты в момент, когда ViewState для страницы уже создана. Т.е. — при PostBack-e только то, что находится во ViewState коллекции будет пересоздано. Чтобы то, что вы хотите сделать работало так, как вам нужно, нужно добавлять объекты динамически в событиях Page_Load или OnInit()/InitializeComponent(). Только при данных условиях динамически созданные контроллы будут пересоздаваться автоматически с сохранением событий и значений. В остальных случаях вам придется заниматься мазохизмом и создавать что то наподобие АСП-эшного ViewState-a. Или создать заранее контроллы, сделать их невидимыми и активизировать их при нажатии какой то кнопки. Но в этом случае вам заранее надо знать, сколько контролов вы будете "создавать динамически"

.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
RomashkinСпасибо, RustM.
RM>Запоминай (как думай сам), какие контролы ты насоздавал, и при рефреше создавай их заново.
а какие способы запоминания существуют? просто чекбоксы генерируются на основе данных базы данных, и не хочется каждый раз на Page_Load подключаться к базе данных зря..
Session? Cache? Application?
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение