2013-07-10 4 views
2

Я наткнулся на проблему с моей формой asp.net.Доступ к динамически созданным текстовым полям

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

protected void txtAmountSubmit_Click(object sender, EventArgs e) 
    { 
     int amountOfTasks; 
     int.TryParse(txtAmountOfTasks.Text, out amountOfTasks); 
     for (int i = 0; i < amountOfTasks; i++) 
     { 
      TextBox txtAddItem = new TextBox(); 
      txtAddItem.ID = "txtAddItem" + i; 
      txtAddItem.TextMode = TextBoxMode.MultiLine; 
      questionNine.Controls.Add(txtAddItem); 
      txtList.Add(txtAddItem.ID); 
     } 
    } 

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

То, что я пытался

  1. Я попытался с помощью this msdn access server controls ID method однако это не работает.

  2. Я попытался добавить эти новые текстовые поля в список, однако я не знал, как обновлять эти текстовые поля, когда у них есть текст. Из-за этого мои результаты были возвращены null.

  3. Я также рассмотрел другие вопросы по SO, такие как this, но они обычно относятся к WPF или winforms, а не к моей проблеме с asp.net (это обычно не проблема, но мне не нужно текст из каждого элемента управления текстовыми полями на моей странице, только те, которые были динамически созданы).

Я также попытался изменить то, как я называю код, который я надеялся работал бы:

string textboxesText = string.Join("\n", txtList.Select(x => x).ToArray()); 

, а затем в моей сцепленной строке (электронная почта тело) я бы назвал:

textboxesText 

Проблема

Поскольку они динамически созданы, мне трудно o вызовите их по их идентификатору, например: txtExampleID.Text, также, поскольку я должен каждый раз увеличивать идентификаторы по одному (поэтому они не переопределяют друг друга), это сделало вещи немного сложнее для меня.

Я не прошу решения для кода, я бы предпочел указатели в правильном направлении, поскольку я все еще участвую.

Итак, чтобы подвести итог: Мне нужно получить текст из динамически созданных текстовых полей, чтобы добавить его в свой почтовый ящик.

+0

Вам необходимо изучить жизненный цикл страницы ASP.NET. Вы должны создавать свои динамические элементы управления в 'Page_Init', иначе они не будут существовать позже (как вы находите). – Belogix

+0

Вы пытались использовать ретранслятор для создания текстовых полей? –

+0

Вам необходимо воссоздать динамически созданные элементы управления с тем же идентификатором, что и раньше, при каждом обратном вызове в 'page_load'. Тем не менее, вы создаете их позже в первый раз. Поэтому просто сохраняйте (например, в 'ViewState' или в скрытом поле) счетчик уже созданных элементов управления, которые вы используете для их воссоздания в' Page_Init' или 'Page_Load' (если вы используете' ViewState'). Затем вы можете добавить новые 'TextBoxes' в' txtAmountSubmit_Click' и соответственно увеличить счетчик. –

ответ

2

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

Я думаю, что самый прямой подход в вашем случае - это расширить идею №1, которую вы уже пробовали. Постройте a List этих элементов управления с достаточной информацией до . Создайте их в Load, но вам необходимо сохранить это List в ViewState или Session.

ViewState["DynamicControls"] = list; 

или

Session["DynamicControls"] = list; 

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

+1

Хороший ответ, но разве вы не подразумеваете 'Init', а не' Load'? Я знаю, что вы можете создать в 'Load', но всегда считали, что« Init »был« официально предложенным »местом. Я мог бы быть неправ! – Belogix

+0

@Belogix, вы также можете использовать «Init». Он действительно работает в обоих местах. Иногда мне приходится использовать «Init», потому что мне нужно установить некоторые вещи до того, как начнется создание модели событий страницы. Хорошее дополнение! –

+0

Спасибо, Майкл, это помогло положить его в контекст, я попытаюсь изучить это больше, а затем реализовать это +1, ответит на это в 5 минут, когда смогу :) –

Смежные вопросы