#c# #asp.net #arrays #controls
#c# #asp.net #массивы #элементы управления
Вопрос:
Я пытаюсь добавить массив элементов управления на страницу aspx (исходный код C #). Это аналогичные элементы управления (критерии поиска для отдельных полей, но будут иметь одинаковые значения). Значения раскрывающегося списка элементов управления в настоящее время устанавливаются в методе Page_Load, например:
protected void Page_Load(object sender, EventArgs e) {
ListItem[] items = new ListItem[3];
//these values are actually set by a database query
items[0] = new ListItem('Apple', 'Apple');
items[1] = new ListItem('Orange', 'Orange');
items[2] = new ListItem('Banana', 'Banana');
FruitDropDown.Items.AddRange(items);
FruitDropDown.DataBind();
}
затем на странице у меня есть элемент управления, подобный:
<asp:DropDownList ID="FruitDropDown" runat="server"/>
Это отлично работает и заполняет элемент управления, но теперь я хочу создать массив этих выпадающих списков — их будет 20, поэтому я не хочу создавать его 20 раз в методе Page_Load. Должен ли я добавить выпадающий список в список, а затем сделать что-то вроде:
<asp:DropDownList ID="FruitDropDown[0]" runat="server"/>
<asp:DropDownList ID="FruitDropDown[1]" runat="server"/>
Как бы я пометил их на странице, а затем смог бы получить доступ к этим значениям в контроллере? Могу ли я сделать что-то подобное, если я уже добавил эти именованные элементы управления на страницу aspx?
protected void Page_Load(object sender, EventArgs e) {
ListItem[] items = new ListItem[3];
//these values are actually set by a database query
items[0] = new ListItem('Apple', 'Apple');
items[1] = new ListItem('Orange', 'Orange');
items[2] = new ListItem('Banana', 'Banana');
for (int x = 0; x < 20; x ) {
FruitDropDown[x].Items.AddRange(items);
FruitDropDown[x].DataBind();
}
Это также требует копирования и вставки элементов управления на странице aspx 20 раз? Что, если он расширится до 100? Могу ли я добавить их в цикле на странице aspx?
Ответ №1:
Элементуправления.FindControl — это то, что вы ищете. Вы можете использовать его для любого элемента управления (например, для самой страницы), чтобы находить элементы управления через их NamingContainer. Поместите их, например, на панель и используйте FindControl на ней.
for (int x = 0; x < 20; x ) {
DropDownList ddlFruit = (DropDownList)FruitPanel.FindControl("FruitDropDown" x);
ddlFruit.Items.AddRange(items[x]);
}
Вы также можете создавать их динамически:
for (int x = 0; x < 20; x ) {
DropDownList ddlFruit = new DropDownList();
ddlFruit.ID = "FruitDropDown" x
ddlFruit.Items.AddRange(items[x]);
FruitPanel.Controls.Add(ddlFruit);
}
Вы должны воссоздавать динамически созданные элементы управления при каждой обратной отправке не позднее, чем в Page_Load с тем же идентификатором, что и раньше, чтобы убедиться, что ViewState загружается правильно и запускаются события.
Комментарии:
1. Если я выполню FindControl, придется ли мне создавать эти элементы управления 20 раз на самой странице? Можно ли это сделать в цикле, чтобы минимизировать скопированный код?
2. Вы можете использовать
FindControls
также для динамически создаваемых элементов управления. Но, как вы можете видеть в моем примере, вы можете выполнить оба в одном цикле без findcontrol, потому что у вас уже есть ссылка на вновь созданный элемент управления там.3. Если я использую второй пример для их динамического создания, я понимаю, что они будут добавлены к элементу управления FruitPanel на странице aspx. Однако, как это обрабатывает позиционирование и макет? Я хочу создать несколько динамических текстовых полей / выпадающих списков и добавил их в одну строку. Как я буду управлять макетом, просто вызывая метод add? Должен ли я устанавливать позицию вручную? Я мог бы добавить 20 элементов управления на страницу, но это кажется плохим способом сделать это — как я мог бы добавить их в цикл на странице, чтобы сохранить согласованность макета?
4. Позиционирование и макет FruitPanel должны управляться CSS так же, как и для выпадающего списка. Если вам нужно больше контроля над макетом каждого выпадающего списка, вы должны показать нам модель, тогда вам, возможно, следует использовать другие элементы управления контейнером, такие как Repeater или GridView , что также делает избыточным динамическое создание элементов управления.
Ответ №2:
Вы можете присвоить им действительные идентификаторы и поместить их все в массив самостоятельно:
<asp:DropDownList ID="FruitDropDown0" runat="server"/>
<asp:DropDownList ID="FruitDropDown1" runat="server"/>
protected void Page_Load(object sender, EventArgs e) {
ListItem[] items = new ListItem[3];
...
DropDownList[] lists = new DropDownList[] { FruitDropDown0
,FruitDropDown1
,...};
foreach(DropDownList list in lists) {
list.Items.AddRange(items);
list.DataBind();
}
}
Комментарии:
1. Так что, мне нужно вырезать и вставить строку <asp: DropDownList ID=»FruitDropDown0″ runat=»server» /> 20 раз (или более) и увеличить счетчик в идентификаторе? Могу ли я создать это в цикле на странице, чтобы мне не приходилось поддерживать скопированный код?
Ответ №3:
Из вашего вопроса похоже, что вы пытаетесь динамически отображать элементы управления на экране
Ответ №4:
Вам следует изучить возможность динамического создания элементов управления.
Ответ №5:
Как @Mark Cidade говорит, что лучшим подходом было бы создать элементы управления в исходном коде. В конце концов, это всего лишь классы.
Самым простым подходом было бы включить в разметку элемент управления, такой как элемент управления-заполнитель, а затем создать коллекцию выпадающих списков в цикле, присвоив каждому уникальный идентификатор, как говорит @Mark Cidade.
Оттуда нужно добавить их в качестве дочерних элементов управления в заполнитель или, если вы хотите, чтобы они были непосредственно на странице, вы можете добавить их в коллекцию элементов управления страницей.