Динамически вставляйте текстовые поля в повторитель и извлекайте их значение - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть Repeater, связанный с SQL, содержащий смесь редактируемых и доступных только для чтения элементов.Когда вы нажимаете кнопку «Редактировать» в строке, редактируемые части должны преобразовываться в текстовые поля, а когда вы нажимаете «Обновить», они должны сохранять ваши изменения.

Вот (очень) упрощенная версия кода OnClick кнопок «Редактировать и обновить»:

switch(commandName)
{
    case "Edit":
        Label1.Visible = false; //hide read-only version
        PlaceHolder1.Visible = true; //show editing version

        //Dict1 is Dictionary<string, string> in this example.
        foreach (var key in Dict1)
        {
            //insert a TextBox dynamically into the PlaceHolder
            PlaceHolder1.Controls.Add(new TextBox 
            { 
                ID = "txt" + key, 
                Text = Dict1[key] 
            });
        }
        break;

    case "Update":
        //retrieve user input from dynamically-added TextBoxes
        foreach (var TextBox1 in PlaceHolder1.Controls.Where(c => c.ID.StartsWith("txt")))
        {
            doStuff(TextBox1);
        }

        Label1.Visible = true; //show read-only version
        PlaceHolder1.Visible = false; //hide editing version
        break;
}

Проблема в том, что мои динамически добавленные текстовые поля отсутствуют, когда страница отправляется обратно,Я изучил PlaceHolder1.Controls в отладчике, и в нем нет текстовых полей.PlaceHolder1 сам находится внутри Repeater, но я не связываю Repeater с PostBack.

Я рассмотрел использование необработанного HTML вместо элементов управления TextBox и извлечение значений из Request.Form, но эточувствует себя хакером для меня.Как я могу сделать так, чтобы динамически добавляемые текстовые поля сохранялись во всех постбэках?


РЕДАКТИРОВАТЬ:

Есть некоторые сложности, которые трудно показать без тонныобразец кода.Вот основные из них:

  • Каждая ячейка в повторителе может иметь смесь текста, доступного только для чтения, и редактируемого текста (т. Е. Динамически вставляемых меток и текстовых ящиков)
  • Не знаюзнать, сколько редактируемых областей будет в каждой ячейке.Исходный текст может выглядеть как blah blah @A1@ blah blah @A2@ blah..., и мне придется вставлять замещающий текст вместо @ A1 @, @ A2 @ и т. Д. В режиме редактирования редактируется только этот замещающий текст.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

Когда вы добавляете элементы управления динамически, они не сохраняются при обратной передаче. Вы должны добавить их на страницу снова после обратной передачи. Я обычно делаю это в Page_Load. Затем, после их добавления, их состояния обратной передачи будут корректно восстановлены позже в жизненном цикле страницы ASP.NET.

Итак,

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

Надеюсь, это поможет!

1 голос
/ 14 апреля 2011

Один из возможных ответов - предварительно задать TEXTBOX в ШАБЛОНЕ ПУНКТА, а затем просто установить его видимость для данной строки в событии щелчка.

Второй возможностью было бы реорганизовать ретранслятор для использования вместо него элемента управления GRIDVIEW. Он поддерживает редактируемые шаблоны из коробки.

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

myval =  request.form["txt" + key];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...