web-dev-qa-db-fra.com

Vous ne trouvez pas le contrôle dans le répéteur asp.net?

J'ai le répéteur suivant ci-dessous et j'essaie de trouver lblA dans le code derrière et il échoue. Sous le balisage se trouvent les tentatives que j'ai faites:

<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

Ensuite, j'ai essayé,

Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");

mais les éléments étaient 0 même si le répéteur m contient 1 modèle d'élément

23
Xaisoft

Vous devez définir l'attribut OnItemDataBound="myFunction"

Et puis dans votre code, procédez comme suit

void myFunction(object sender, RepeaterItemEventArgs e)
{
   Label lblA = (Label)e.Item.FindControl("lblA");
}

Soit dit en passant, vous pouvez utiliser cette même approche exacte pour les répéteurs imbriqués. C'EST À DIRE:

<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 puis 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 sur un répéteur intérieur et ils ne réalisent pas à quel point ils font des choses pour eux-mêmes.

28
Spencer Ruport

J'ai juste eu le même problème.

Il nous manque type d'élément lors de la boucle dans les éléments. Le tout premier élément du répéteur est le en-tête, et l'en-tête n'a pas les éléments asp que nous recherchons.

Essaye ça:

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");}
8
dvdmn

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
2
Kyle B.
1
Dan Diplo

Vous devez d'abord lier.
par exemple)

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

rptDetails.DataBind();
0
Peter