Не удается найти элемент управления в репитере asp.net?
У меня есть следующий ретранслятор ниже, и я пытаюсь найти lblA в коде позади, и он терпит неудачу. Ниже разметки являются попытки, которые я сделал:
<asp:Repeater ID="rptDetails" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><strong>A:</strong></td>
<td><asp:Label ID="lblA" runat="server"></asp:Label>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
Сначала я попробовал,
Label lblA = (Label)rptDetails.FindControl("lblA");
но lblA был null
Затем я попытался,
Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");
но элементы были равны 0, хотя m повторитель содержит 1 itemtemplate
Ответы
Ответ 1
Вам нужно установить атрибут OnItemDataBound="myFunction"
И затем в вашем коде выполните следующие
void myFunction(object sender, RepeaterItemEventArgs e)
{
Label lblA = (Label)e.Item.FindControl("lblA");
}
Кстати, вы можете использовать этот точный подход для вложенных репитеров. IE:
<asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerFunction">
<ItemTemplate>
<asp:Repeater ID="innerRepeater" runat="server" OnItemDataBound="innerFunction">
<ItemTemplate><asp:Label ID="myLabel" runat="server" /></ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
И затем в вашем коде:
void outerFunction(object sender, RepeaterItemEventArgs e)
{
Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater");
innerRepeater.DataSource = ... // Some data source
innerRepeater.DataBind();
}
void innerFunction(object sender, RepeaterItemEventArgs e)
{
Label myLabel = (Label)e.Item.FindControl("myLabel");
}
Слишком часто я вижу, как люди вручную привязывают элементы к внутреннему ретранслятору, и они не понимают, как сложно они делают вещи для себя.
Ответ 2
У меня была такая же проблема.
Мы пропускаем тип элемента при циклическом перемещении элементов. Самым первым элементом в репитере является заголовок , а заголовок не содержит asp-элементов, которые мы ищем.
Попробуйте следующее:
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");}
Ответ 3
Изучите Repeater.ItemDataBound Event.
Ответ 4
Код для VB.net
Protected Sub rptDetails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptDetails.ItemDataBound
If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
Dim lblA As Label = CType(e.Item.FindControl("lblA"), Label)
lblA.Text = "Found it!"
End If
End Sub
Ответ 5
Сначала вы должны связать.
например)
rptDetails.DataSource = dataSet.Tables["Order"];
rptDetails.DataBind();