Динамически создавать текстовые поля (ASP.net/C#)

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

int num_flds = int.Parse(a_fld.Text);
for (int i = 0; i < num_flds; i++)
{
    TextBox tmp = new TextBox();
    tmp.ID = "answer_box" + i;
    tmp.Width = Unit.Pixel(300);
    answer_inputs.Controls.Add(tmp);
}

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
6 534
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Создайте что-нибудь в своем классе Page для хранения значений:

private readonly Dictionary<TextBox, string> values=new Dictionary<TextBox, string>();

Сделайте метод, который будет действовать как обратный вызов для текстовых полей при изменении их значения:

void tmp_TextChanged(object sender, EventArgs e)
    {
        TextBox txt = sender as TextBox;
        if (txt!=null)
        {
            values.Add(txt,txt.Text);
        }
    }

А затем добавьте этот метод в каждое текстовое поле по мере их добавления:

int num_flds;
    if (!int.TryParse(a_fld.Text,out num_flds))
    {
        num_flds = 0;
    }
    for (int i = 0; i < num_flds; i++)
    {
            TextBox tmp = new TextBox();
            tmp.ID = "answer_box" + i;
            tmp.Width = Unit.Pixel(300);
            answer_inputs.Controls.Add(tmp);
            tmp.TextChanged += tmp_TextChanged;
    }

Наконец, вы просматриваете словарь при обратном вызове, чтобы увидеть, содержит ли он какие-либо значения. Сделайте это, например, в методе OnPreRender.

Обновлено: с этим возникает проблема, если количество текстовых полей уменьшается при обратной передаче. Следует использовать какой-нибудь безопасный способ воссоздать предыдущие текстовые поля при обратной передаче.

Другие вопросы по теме