Чтобы динамически добавить элементы управления на страницу aspx, выполните следующие действия.
Сначала добавьте заполнитель на странице ASPX:
<asp:PlaceHolder runat="server" id="AssessCanvas" />
Шахта называется "AssessCanvas". Далее добавьте сами элементы управления. Вот код, который я использую в методах, вызываемых Page_Load для создания метки и текстового поля. Метка является приглашением для «Вес:», а текстовое поле используется для ввода значения веса (в этом примере я также включаю значение веса при создании поля):
Label aLbl = new Label { Text = "Weight: ", ID = ("WSLabel" + counter) };
counter++;
AssessCanvas.Controls.Add(aLbl);
TextBox aBox = new TextBox { ID = "XTest1", Columns = 5, Text = weight.ToString("##0.0"), Width = 50 };
AssessCanvas.Controls.Add(aBox);
Я использую «WSLabelN» (где N - число), чтобы дать уникальный идентификатор каждой метке. Поскольку я хочу сканировать все свои текстовые поля, чтобы получить их содержимое при отправке формы, я даю каждому из них идентификатор формы «XTestN» (где N - уникальный идентификатор для каждого поля - здесь «XTest1» «говорит мне, что это поле веса).
Когда я готов обработать отправку формы, я делаю это:
// Look at each key submitted with the form - *some* of these will be my input text boxes
foreach (string aStr in form.AllKeys)
{
// Is this an input text box? Yes if it has "XTest" in it somewhere.
int position = aStr.IndexOf("XTest");
if (position > 0)
{
// The data entry fields for each input box follows the format: <ASP.NET Prefix>XTest<TID>
// Here I get the tid so I know what to do with the value that was entered
short tid = BSDIUtil.StrToIntDef(aStr.Substring(position + 5));
switch (tid)
{
case 1: SaveWeight(BSDIUtil.StrToFloatDef(form.Get(aStr))); break;
case 2: SaveJP3P1(BSDIUtil.StrToFloatDef(form.Get(aStr))); break;
... etc...
}
}
}
В моей системе мне часто приходится размещать несколько полей на странице, чтобы собирать значения для одного элемента тестирования (система здесь взята со страницы фитнес-тестирования). Например, «SaveJP3P1» выше не вызывается, как показано, потому что он фактически извлекает данные из девяти различных полей. Я упростил это для примера по понятным причинам.
Такой подход дает вам большую гибкость. На моей полной странице у меня есть флажки, метки заголовков (например, метка с форматированием HTML / CSS в дополнение к тексту метки) и даже несколько DIVS для фитнес-тестов с несколькими панелями для их ввода. И все это делается динамически. Очевидно, что сетка не будет работать и не добавит элемент управления к дереву элементов управления, как предлагали другие.