2009-07-29 15 views
23

Tengo el siguiente repetidor a continuación y estoy tratando de encontrar lblA en el código y falla. Por debajo del margen de beneficio son los intentos que he hecho:¿No puede encontrar el control dentro del repetidor asp.net?

<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> 

En primer lugar he intentado,

Label lblA = (Label)rptDetails.FindControl("lblA"); 

pero LBLa era nula

Luego probé,

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

pero ítems fue 0 aunque el repetidor m contiene 1 elemento plantilla

Respuesta

28

Es necesario configurar el atributo OnItemDataBound="myFunction"

Y luego, en su código haga lo siguiente

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

Por cierto se puede utilizar este mismo método exacto para repetidores anidados. 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> 

Y luego en el código:

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"); 
} 

Demasiado a menudo veo a la gente manualmente los elementos de unión en un repetidor de interior y no se dan cuenta de lo difícil que están haciendo las cosas por sí mismos .

+0

estoy un poco confundido. Lo que estoy haciendo en realidad es cuando hago clic en un enlace Ver detalles en 1 página, me lleva a una vista detallada en otra página que tiene el repetidor y en page_load, estoy tratando de ubicar lblA – Xaisoft

+0

Editado. Espero que eso explique un poco más. –

+0

Ok, lo que terminé haciendo fue mover una variable DataTable al nivel superior de la clase. Luego creé el ItemDataBoundEvent y allí revisé el lblA en el repetidor y, si lo encontraba, configuré un texto que obtuve de una fila en DataTable. ¿Estoy en lo correcto en mi comprensión de esto? Gracias – Xaisoft

1

de 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 
0

Usted debe primero atar.
por ejemplo)

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

rptDetails.DataBind(); 
7

yo sólo tenía el mismo problema.

Nos falta el tipo de elemento mientras bucle en los elementos. El primer elemento en el repetidor es el encabezado , y el encabezado no tiene los elementos asp que estamos buscando.

Prueba esto:

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

Gracias, tengo el mismo problema y paso tanto tiempo para descubrir el problema ¡SO es genial! – Kamran

+0

ídem - esto realmente debería haber sido incluido en el propio ejemplo de MSDN ... pero ¿qué deberíamos esperar de eso eh? – Rich

Cuestiones relacionadas