Заполнение DropDownList внутри Repeater не работает - PullRequest
4 голосов
/ 16 сентября 2009

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

Вот мой код 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()));
        }
    }

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

Ответы [ 6 ]

21 голосов
/ 16 сентября 2009

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

В раскрывающемся списке определите событие привязки данных:

<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();
 }

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

6 голосов
/ 16 сентября 2009
for(int i=1;i > 5;i++)

Должен читать ...

for(int i=1;i < 5 ;i++)
1 голос
/ 16 сентября 2009

На странице .aspx:

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

В коде:

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 голосов
/ 22 августа 2014

Изменение: для (int i = 1; i> 5; i ++) Для того, чтобы: для (int i = 1; i <5; i ++) </p>

Или:

    using System.Linq;

    ddl.DataSource = Enumerable.Range(1, 5);
    ddl.DataBind();
    ddl.SelectedValue = yourValue
0 голосов
/ 16 сентября 2009

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

0 голосов
/ 16 сентября 2009

закрытый критерий пустотыScore_ItemDataBound (источник объекта, RepeaterCommandEventArgs e)

...