Динамическое текстовое поле при нажатии LinkButton

Я создаю динамические текстовые поля на странице, щелкая LinkButton.

Однако после этого, если страница отправлена, я не могу найти элементы, созданные динамически, поэтому не могу отправить информацию в базу данных.

protected void lbAddTag_Click(object sender, EventArgs e)
{
   for (int i = 0; i < 3;i++ )
    {
        CreateTextBox("txtTag-" + i.ToString());
    }

}

private void CreateTextBox(string ID)
{
    TextBox txt = new TextBox();
    txt.ID = ID;
    txt.Width = Unit.Pixel(300);
    //txt.TextChanged += new EventHandler(OnTextChanged);
    txt.AutoPostBack = false;
    tagsPanel.Controls.Add(txt);

    Literal lt = new Literal();
    lt.Text = "<br /><br />";
    tagsPanel.Controls.Add(lt);
}

Если я поставлю:

foreach (Control c in tagsPanel.Controls)
{
    if (c is TextBox)
    {
        lblError.Text += c.ClientID + "  ,  ";
    }
}

в методе lbAddTag_Click я вижу элементы, и они существуют, но если я отправлю страницу и попытаюсь вставить значения в базу данных, ничего...

Любая подсказка очень ценится.


person Alex Peta    schedule 07.01.2011    source источник


Ответы (4)


Если вы создаете элементы управления динамически, они не сохраняются в состоянии иерархии/представления элементов управления при отправке.

Проверьте эту статью: http://www.4guysfromrolla.com/articles/092904-1.aspx

Я бы предпочел иметь элемент управления повторителем, а затем поддерживать ArrayList в сеансе и использовать его в качестве источника данных для элемента управления повторителем. Когда я хочу добавить строку, я бы предпочел добавить строку в ArrayList в сеансе и повторно привязать элемент управления повторителем. Дайте мне знать, если вам нужен пример.

person Chandu    schedule 07.01.2011
comment
Спасибо Cybermate, теперь я понял. Если бы вы могли привести пример, было бы здорово. Я сейчас читаю пост 4guysfromrolla - person Alex Peta; 08.01.2011
comment
Я разместил сырой образец на pastebin. Проверьте этот URL: pastebin.com/dwqHDTUC - person Chandu; 08.01.2011
comment
привет Cybermante, я добавил его, и он отлично работает. большое спасибо. - person Alex Peta; 08.01.2011

Материалы жизненного цикла страницы действительно сложны в ASP.NET. Вы должны убедиться, что LinkButtons создаются таким же образом, прежде чем жизненный цикл попытается загрузить их состояния просмотра. Лучший способ сделать это, вероятно, настроить элемент управления/страницу так, чтобы при сохранении ViewState он сначала добавлял информацию о текстовых полях, которые вы создали, в ViewState. Затем, сразу после загрузки ViewState, создайте текстовые поля на основе этой информации. Это можно сделать, переопределив методы SaveViewState и LoadViewState.

person StriplingWarrior    schedule 07.01.2011

Вы должны воссоздать каждый динамический элемент управления в Postback, иначе их значения не могут быть восстановлены из ViewState. Поэтому вам нужно сохранить количество ваших текстовых полей (например, как переменную ViewState). Им нужно получить один и тот же идентификатор, поэтому вы должны использовать счетчик в качестве суффикса от идентификатора (например, TextBox_4).

person Tim Schmelter    schedule 07.01.2011

Коллекция Controls представляет собой древовидную структуру. Элементы управления содержат другие элементы управления, поэтому он может иметь 1 элемент управления «Панель», который содержит несколько других панелей, а те содержат текстовые поля, которые вы ищете. Вы должны рекурсивно пройти через элементы управления.

Посмотрите на этот http://msdn.microsoft.com/en-us/library/486wc64h.aspx

Или это:

public delegate void control_visitor(Control control);

public void iterate_controls(ControlCollection controls, control_visitor visitor)
{
    foreach (Control control in controls)
    {
        visitor(control);
        iterate_controls(control.Controls, visitor);
    }
}
person Zac    schedule 07.01.2011
comment
привет Зак. моя проблема не связана с повторением элементов управления. Я понял, как это делается, и сделал это. проблема в том, что элементы управления не сохраняются в состоянии просмотра после отправки страницы. спасибо Алекс - person Alex Peta; 08.01.2011