2009-01-30 11 views
5

Necesito obtener un valor de un cuadro de texto dentro de un FooterTemplate en el evento OnClick de un botón. Mi primer pensamiento fue recorrer los elementos-propiedad en mi repetidor, pero como puede ver en esta muestra, solo incluye los elementos de datos reales, no el pie de página.¿Por qué el pie de página no está incluido en Repeater.Items?

ASPX:

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     Item<br /> 
    </ItemTemplate> 
    <FooterTemplate> 
     Footer<br /> 
     <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
    </FooterTemplate> 
</asp:Repeater> 
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 

Code-behind.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ListItemCollection items = new ListItemCollection(); 
    items.Add("value1"); 
    items.Add("value2"); 
    Repeater1.DataSource = items; 
    Repeater1.DataBind(); 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    System.Diagnostics.Debug.WriteLine(Repeater1.Items.Count); 
} 

Este código será única salida "2" como el recuento, así que ¿cómo puedo llegar a hacer referencia a mi cuadro de texto dentro de la FooterTemplate ?

Respuesta

1

A partir del MSDN documentation, los Items es simplemente un conjunto de RepeaterItems basado en el DataSource al que está vinculando y no incluye elementos en el encabezado o FooterTemplates.

Si desea hacer referencia al cuadro de texto, puede obtener una referencia en el evento ItemDataBound del repetidor donde puede probar el pie de página.

E.g.

private void Repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
{ 

    if (e.Item.ItemType == ListItemType.Footer) 
    { 
    TextBox textBox = e.Item.FindControl("TextBox1") as TextBox; 
    } 
}  
+0

El Repeater_ItemDataBound ocurre antes de que el usuario ha introducido ningún texto . ¿Cómo puedo obtener ese texto en el evento OnClick una vez que el usuario ha ingresado el texto? – Espo

+0

Hola Espo Tendrías que escribir un método recursivo para profundizar en Repeater1.Controla la comprobación de colecciones para un cuadro de texto llamado TextBox1. Puede hacerlo más rápido solo mirando primero en el pie de página. –

+0

Ray: Esa es la solución que estoy usando ahora, pero parece "sucio" crear una función recursiva solo para obtener un valor de un cuadro de texto. Esperaba que hubiera una manera más limpia de hacerlo. – Espo

1

Puede encontrar controles en el repetidor. Eso le dará todos los controles en el repetidor (colección RepeaterItems). Ahora se puede hacer algo como esto:

RepeaterItem footerItem=null; 
foreach(Control cnt in Repeater1.Controls) 
{ 
if(cnt.GetType() == typeof(RepeaterItem) && ((RepeaterItem)cnt).ItemType == ListItemType.Footer) 
{ 
footerItem = cnt; 
break; 
} 
} 
0

El pie de página debe ser el último control secundario del repetidor para que pueda hacer algo así ..

RepeaterItem riFooter = Repeater1.Controls[Repeater1.Controls.Count - 1] as RepeaterItem; 
if (riFooter != null && riFooter.ItemType == ListItemType.Footer) { 
    TextBox TextBox1 = riFooter.FindControl("TextBox1") as TextBox; 
    if (TextBox1 != null) { 
     TextBox1.Text = "Test"; 
    } 
} 
Cuestiones relacionadas