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

Était-ce utile?

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

Vous devez d'abord vous lier.
par exemple)

rptDetails.DataSource = dataSet.Tables["Order"];

rptDetails.DataBind();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top