2010-03-20 45 views
19

Todas las formas en que puedo pensar para hacer esto parecen muy hackish. ¿Cuál es la forma correcta de hacer esto, o al menos más común?Accediendo a cuadros de texto en Repeater Control

Estoy recuperando un conjunto de imágenes de una consulta LINQ-a-SQL y lo enlace de datos y algunos otros datos a un repetidor. Necesito agregar un cuadro de texto a cada elemento en el repetidor que permitirá al usuario cambiar el título de cada imagen, muy similar a Flickr.

¿Cómo accedo a los cuadros de texto en el control del repetidor y sé a qué imagen pertenece ese cuadro de texto?

Aquí es lo que el control del repetidor se vería así, con un botón de envío que actualizar todas las filas de la imagen en LINQ to SQL:

alt text http://casonclagg.com/layout.jpg

Editar:

Este código funciona

Solo asegúrate de no volar tus valores de distancia por Binding outsi de de if (! Page.IsPostBack) me gusta .. Vaya.

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <div class="itemBox"> 
      <div class="imgclass"> 
       <a title='<%# Eval("Name") %>' href='<%# Eval("Path") %>' rel="gallery"> 
        <img alt='<%# Eval("Name") %>' src='<%# Eval("Path") %>' width="260" /> 
       </a> 
      </div> 
      <asp:TextBox ID="TextBox1" Width="230px" runat="server"></asp:TextBox> 
     </div> 
    </ItemTemplate> 
</asp:Repeater> 

y presentar Click:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem item in Repeater1.Items) 
    { 
     TextBox txtName = (TextBox)item.FindControl("TextBox1"); 
     if (txtName != null) 
     { 
      string val = txtName.Text; 
      //do something with val 
     } 
    } 
} 
+0

¿Está tratando de acceder a los cuadros de texto en el cliente o en el servidor después de una devolución de datos? –

+0

Servidor en Submit_Click – Jason

Respuesta

31

Ha intentado algo así como después en el botón clic: -

foreach (RepeaterItem item in Repeater1.Items) 
{ 
     TextBox txtName= (TextBox)item.FindControl("txtName"); 
     if(txtName!=null) 
     { 
     //do something with txtName.Text 
     } 
     Image img= (Image)item.FindControl("Img"); 
     if(img!=null) 
     { 
     //do something with img 
     } 
} 

/* Donde txtName e IMG son los ID de la caja de texto y la controles de imagen, respectivamente, en el repetidor. */

Espero que esto ayude.

+0

No conoce el valor de "txtName", ¿verdad? – Jason

+1

Obtendrá el valor utilizando esa propiedad txtName.Text en el ejemplo anterior. –

+0

Quise decir que no sabes el nombre del control. Entonces, ¿cómo lo encuentras ... como en FindControl ("nameOfControl"). ¿Qué es nameOfControl? – Jason

0

En devolución de datos, se puede iterar sobre la colección de RepeaterItems en repeater.Items. A continuación, podría recuperar cada cuadro de texto con el código como

TextBox tbDemo = (TextBox)rptr.Items[index].FindControl("textBox"); 
11

.aspx

 <asp:Repeater ID="rpt" runat="server" EnableViewState="False"> 
     <ItemTemplate> 
       <asp:TextBox ID="txtQty" runat="server" /> 
     </ItemTemplate> 
     </asp:Repeater> 

.cs

 foreach (RepeaterItem rptItem in rpt.Items) 
     { 
      TextBox txtQty = (TextBox)rptItem.FindControl("txtQty"); 
      if (txtQty != null) { Response.Write(txtQty.Text); }   
     } 

Asegúrese de añadir EnableViewState = "false" a su repetidor, de lo contrario obtendrá cadena vacía. (Eso desperdició mi tiempo, no pierda el suyo :))

+2

+1 por mencionar EnableViewState –

+0

¿Qué pasaría si quisiera obtener todos los cuadros de texto y agregarlos a una lista para desactivar la propiedad 'readonly' en true? – Si8

Cuestiones relacionadas