2012-11-24 2 views
2

Файл .aspx имеет обычный html-код и элемент управления Panel1. Прежде всего, я создаю раскрывающийся список под названием «ddl» и добавляю к нему некоторые ListItems, все это из кода позади. Затем я хочу создать определенное количество других DropDownLists и скопировать им все элементы ListItems, которые я добавил в «ddl», после чего мне нужно, чтобы они были добавлены в элемент «Panel1», когда страница запущена. Самая важная часть заключается в том, что я хочу, чтобы все динамически созданные dropdownlists имели выбранное значение при запуске страницы. Вы можете увидеть код ниже:Свойство SelectedValue и динамически созданное DropDownLists. ASP.NET

protected void Page_Load(object sender, EventArgs e) 
{ 
    DropDownList ddl = new DropDownList(); 
    ddl.Items.Add(new ListItem("One", "1")); 
    ddl.Items.Add(new ListItem("Two", "2")); 
    ddl.Items.Add(new ListItem("Three", "3")); 
    ddl.Items.Add(new ListItem("Four", "4")); 
    ddl.Items.Add(new ListItem("Five", "5")); 
    ddl.Items.Add(new ListItem("Six", "6")); 
    ddl.Items.Add(new ListItem("Seven", "7")); 

    int j = 2; 
    for (int h = 0; h < 3; h++) 
    { 
     DropDownList ddlDynamic = new DropDownList(); 

     //Add the items from ddl to the new dropdownlsit 
     for (int i = 0; i < ddl.Items.Count; i++) 
     { 
      ddlDynamic.Items.Add(ddl.Items[i]); 
     } 
     //the selected item in the first dropdownlist 
     //must be "Two" but it will be "Four". WHY??? 
     ddlDynamic.SelectedValue = j.ToString(); 
     ddlDynamic.ID = h.ToString(); 
     Panel1.Controls.Add(ddlDynamic); 
     Panel1.Controls.Add(new LiteralControl("<br />")); 
     j++; 
    } 
} 

Проблема здесь состоит в том, что выбранное значение для всех трех DropDownLists будет то же самое, и это будет «четверка», когда логически первый должен быть «два», второй " Три ", а третий должен иметь значение" Четыре "в качестве выбранного значения. Первый вопрос: что я делаю неправильно?

Второй вопрос. При использовании ddlDynamic.Items.FindByValue(j.ToString()).Selected = true; вместо ddlDynamic.SelectedValue = j.ToString(); Я получаю «Невозможно выбрать несколько элементов в DropDownList». Почему это?

Thank you.

ответ

2

Я нашел ответ. Важно помнить, что строка ddlDynamic.Items.Add(ddl.Items[i]); добавляет элементы по ссылке из раскрывающегося списка «ddl» и не копирует ListItems в каждый DropDownLists, созданный динамически с циклом «for». Все выпадающие списки, созданные динамически, используют ТОЛЬКО СЛЕДУЮЩИЕ ИСПРАВЛЕНИЯ ListItems и добавляются в «ddl». Важно знать, что:

ddlDynamic.DataSource = ddl.Items; 
     ddlDynamic.DataBind(); 

будет делать то же самое: будет использовать ListItems по ссылке из «DDL». Таким образом, решение я нашел, чтобы создать ListItems для каждого динамически созданного DropDownList, и заполнить их из источника, в этом случае это будет DataTable:

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataTable table = new DataTable(); 
    table.Columns.Add("text", typeof(string)); 
    table.Columns.Add("value", typeof(string)); 

    table.Rows.Add("One", "1"); 
    table.Rows.Add("Two", "2"); 
    table.Rows.Add("Three", "3"); 
    table.Rows.Add("Four", "4"); 
    table.Rows.Add("Five", "5"); 
    table.Rows.Add("Six", "6"); 
    table.Rows.Add("Seven", "7"); 

    int j = 1; 
    for (int h = 0; h < 3; h++) 
    { 
     DropDownList ddlDynamic = new DropDownList(); 
     foreach (DataRow rw in table.Rows) 
     { 
      ddlDynamic.Items.Add(new ListItem((string)rw["text"], (string)rw["value"])); 
     } 

     ddlDynamic.SelectedValue = j.ToString(); 
     ddlDynamic.ID = h.ToString(); 
     Panel1.Controls.Add(ddlDynamic); 
     Panel1.Controls.Add(new LiteralControl("<br />")); 
     j++; 
    } 
} 

Если кто-то есть идея получше, пожалуйста, дайте мне знать.

0

Рекомендую вам прочитать this article. У этого есть пункт: «легко предположить, что все элементы управления, которые добавлены в заполнитель, также автоматически добавляются в ViewState. Однако это не так»

+0

Благодарим за ответ. Статья, на которую вы указали, действительно хороша. Однако ответ немного отличается. – John

1

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

protected void Page_Load(object sender, EventArgs e) 
{ 
    var numListControls = 3; 
    for (int i = 0; i < numListControls; i++) 
    { 
     var newList = new DropDownList() { ID = i.ToString() }; 
     newList.Items.AddRange(GetListItems(i + 1)); 
     Panel1.Controls.Add(newList); 
     Panel1.Controls.Add(new LiteralControl("<br />")); 
    }   
} 

string[] values = new[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven" }; 
public ListItem[] GetListItems(int selectedValue) 
{   
    return values.Select((val, pos) => new ListItem() { 
     Text=val, 
     Value=(pos + 1).ToString(), 
     Selected = selectedValue == pos 
    }).ToArray(); 
} 
+0

Да, у вас также есть ответ на ответ. Однако этот фрагмент кода используется на странице, где у меня есть много категорий и подкатегорий в древовидной структуре, и когда я хочу их редактировать, я загружаю их на страницу, так что рядом с каждым названием категории будет выпадающий список с выбранным ParentID из этой конкретной категории. Так как ParentID зависит от идентификатора другой категории, для меня было важно добавить этот ParentId к «значению» списка, в то время как свойство «Текст» в списке показывает имя ParentId. Однако логично использовать 2D-массив для решения этой проблемы. Спасибо за ваш ответ. – John

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