2009-09-16 3 views
4

Я пытаюсь заполнить выпадающий список внутри ретранслятора, но я не очень успешный. Возможно, я ошибаюсь EventArgs e.Заполнение DropDownList внутри Repeater не работает

Вот мой ASPX код:

 <asp:Repeater runat="server" id="criteriaScore"> 
      <HeaderTemplate> 
       <ul>   
       <li class="header"><span class="item">Kriterie</span><span class="value">Poeng</span><span class="description">Beskrivelse</span></li> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <li> 
        <span class="item"> <%# Eval("criteria") %>:</span> 
        <asp:DropDownList id="ddlRating" runat="server" autopostback="true" enableviewstate="false"></asp:DropDownList> 
        <span class="value score<%# Eval("lvl") %>" title="<%# Eval("description") %>"> </span> 
       </li> 
      </ItemTemplate> 
      <FooterTemplate> 
       </ul> 
      </FooterTemplate> 
     </asp:Repeater> 

И код позади:

protected void criteriaScore_ItemDataBound(object sender, DataListCommandEventArgs e) 
    { 
     DropDownList ddl = (DropDownList)e.Item.FindControl("ddlRating"); 

     for(int i=1; i > 5; i++) 
     { 
      ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
     } 
    } 

Может кто-то пожалуйста, руководство меня на правильный путь? :)

+0

Вы должны отлаживать приложение, особенно разбивая строку Items.Add, чтобы убедиться, что это происходит. –

+0

Я не могу получить отладочную работу с Visual Web Developer 2008 :( – Steven

ответ

21

Отделите другие ответы по этому вопросу, событие ItemDataBound не должно использоваться для привязки данных управления, сделайте это на уровне управления.

В вашем 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 < 5; i++) 
    { 
     ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
    } 

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

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

+0

Спасибо. Вышеприведенный ответ работает, но поскольку это лучшая практика, я пойду на это решение :) – Steven

+1

+1 простой приятный ответ –

+2

+1 хорошая практика –

0

частная пустота criteriaScore_ItemDataBound (источник объекта, RepeaterCommandEventArgs е)

6
for(int i=1;i > 5;i++) 

Следует читать ...

for(int i=1;i < 5 ;i++) 
+0

+1, более того, считается, что правильная практика начинать итерацию с 'i = 0' – Juri

1

В .aspx Страница:

<asp:Repeater runat="server" id="criteriaScore" 
       OnItemDataBound="criteriaScore_ItemDataBound"> 

В Code-Behin d:

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"); 

     for(int i=0; i < 5; i++) 
     { 
      ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
     } 
    } 
} 
+0

Спасибо, что сделал трюк :) – Steven

0

Независимо от того, как реализован метод (есть несколько способов), событие ItemDataBound не прилагаются к ретранслятору в разметке.

0

Изменение: для (INT I = 1; я> 5; я ++) To: для (INT I = 1; я < 5; я ++)

Или:

using System.Linq; 

    ddl.DataSource = Enumerable.Range(1, 5); 
    ddl.DataBind(); 
    ddl.SelectedValue = yourValue 
Смежные вопросы