Impossible de trouver le contrôle dans asp.net repeater?
Question
J'ai le répéteur suivant ci-dessous et j'essaie de trouver lblA dans le code derrière et cela échoue. Sous le balisage figurent les tentatives que j'ai effectuées:
<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>
J'ai d'abord essayé,
Label lblA = (Label)rptDetails.FindControl("lblA");
mais lblA était nul
Puis j'ai essayé,
Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");
mais Items était 0 même si m repeater contient 1 itemtemplate
La solution
Vous devez définir l'attribut OnItemDataBound = " maFonction "
Dans votre code, procédez comme suit
void myFunction(object sender, RepeaterItemEventArgs e)
{
Label lblA = (Label)e.Item.FindControl("lblA");
}
Incidemment, vous pouvez utiliser exactement la même approche pour les répéteurs imbriqués. 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>
Et ensuite dans votre code:
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");
}
Trop souvent, je vois des gens lier manuellement des éléments à un répéteur interne et ils ne réalisent pas à quel point ils fabriquent des choses difficiles.
Autres conseils
Je viens d'avoir le même problème.
Le type d'élément est manquant lorsque vous mettez les éléments en boucle. Le tout premier élément du répéteur est en-tête , et l'en-tête ne contient pas les éléments asp que nous recherchons.
Essayez ceci:
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");}
Code pour 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
Étudiez le Repeater.ItemDataBound Evénement .
Vous devez d'abord vous lier.
par exemple)
rptDetails.DataSource = dataSet.Tables["Order"];
rptDetails.DataBind();