Заполнение DropDownList внутри Repeater не работает
Я пытаюсь заполнить выпадающий список внутри ретранслятора, но я не очень успешен. Я, вероятно, использую неправильные 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 ответов
Несмотря на другие ответы на этот вопрос, событие 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();
}
Вы должны попытаться выполнить всю свою привязку данных на уровне управления, вместо того, чтобы искать что-то, и ваша сетка должна знать, что в ней содержится. Каждый элемент управления может заботиться о себе;) Таким образом, гораздо проще добавлять и удалять элементы управления в шаблон и сохранять эти изменения изолированными.
for(int i=1;i > 5;i++)
Должен прочесть...
for(int i=1;i < 5 ;i++)
На странице.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()));
}
}
}
Независимо от того, как реализован метод (есть несколько способов), событие ItemDataBound не прикрепляется к повторителю в разметке.
Закрытые пустые критерии Score_ItemDataBound(источник объекта, RepeaterCommandEventArgs e)
Изменить: for(int i=1;i > 5;i++) To: for(int i=1;i < 5;i++)
Или же:
using System.Linq;
ddl.DataSource = Enumerable.Range(1, 5);
ddl.DataBind();
ddl.SelectedValue = yourValue