2009-09-16 3 views
1

Выполнение операции Populating DropDownList inside Repeater not working.Невозможно установить SelectedValue для DropDownList

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

Вот мой код:

protected void criteriaScore_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 

     // This event is raised for the header, the footer, separators, and items. 
     // Execute the following logic for Items and Alternating Items. 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 

      DropDownList ddl = (DropDownList)e.Item.FindControl("ddlRating"); 
      DataRowView drw = (DataRowView)e.Item.DataItem; 

      for (int i = 1; i < 6; i++) 
      { 
       ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
      } 
      ddl.DataBind(); // <- Not sure if this is needed here. 
      ddl.SelectedValue = drw.Row["lvl"].ToString(); 
     } 
    } 

drw.Row [ «ур»] ToString() является значение из. 1 -5.

Я пробовал настройки SelectedValue и SelectedIndex.

Я также попытался

ddl.SelectedValue = Convert.ToString(ddl.Items.FindByText(drw.Row["lvl"].ToString()).Value) ; 

Я бегу из идей.

ответ

7

Ого вы делаете это гораздо сложнее, чем это должно быть. Не делайте этого на ItemDataBound, делайте это на свойстве DataBinding.

В вашем DropDownList определить событие DataBinding:

<asp:DropDownList runat="server" ID="ddlYourDDL" OnDataBinding="ddlYourDDL_DataBinding"> 

Затем осуществить событие OnDataBinding:

protected void ddlYourDDL_DataBinding(object sender, System.EventArgs e) 
{ 
    DropDownList ddl = (DropDownList)(sender); 
    for (int i = 1; i < 6; i++) 
    { 
     ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
    } 

    // Now that the items are all there, set the selected property 
    ddl.SelectedValue = Eval("lvl").ToString(); 
} 

Вы должны попробовать и сделать свои привязки данных на уровне управления вместо того, чтобы искать вещи и имеющие ваша сетка должна знать о том, что она содержит. Каждый элемент управления может позаботиться о себе;)

Я не согласен с тем ответом, данным в вашем предыдущем связанном вопросе, чтобы использовать событие ItemBound. Это событие должно использоваться на уровне «item», когда что-то должно влиять на более чем один элемент управления.

Редактировать: Я также добавил эту информацию к вашему другому вопросу, поэтому, если она будет найдена в будущем, другие не используют событие ItemBound для этой цели.

+0

Да, это сработало довольно красиво :) – Steven

0

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

EDIT: Вот два примера - я предпочитаю FindByValue синтаксис сам ...

YourDDL.ClearSelection(); 
foreach (ListItem item in YourDDL.Items) 
{ 
    if (item.Value == YourString) 
    { 
     item.Selected = true; 
     break; 
    } 
} 


YourDDL.Items.FindByValue("1").Selected = true; 
Смежные вопросы