2009-01-30 4 views
5

Ich muss einen Wert aus einem Textfeld in einer FooterTemplate im OnClick-Ereignis einer Schaltfläche abrufen. Mein erster Gedanke war, die Items-Property auf meinem Repeater zu durchlaufen, aber wie Sie in diesem Beispiel sehen können, enthält es nur die eigentlichen Datenobjekte, nicht das Footer-Item.Warum ist das Fußzeilenelement nicht in Repeater.Items enthalten?

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

Dieser Code wird nur dann ausgegeben, "2", wie der Graf, so wie bekomme ich meine Textbox innerhalb der FooterTemplate referenzieren ?

Antwort

1

Von der MSDN documentation ist die Items einfach eine Gruppe von RepeaterItems, die auf der DataSource basieren, an die Sie gebunden sind, und enthält keine Elemente in den Header- oder FooterTemplates.

Wenn Sie das Textfeld referenzieren möchten, können Sie einen Verweis auf das ItemDataBound-Ereignis vom Repeater abrufen, in dem Sie die Fußzeile testen können.

z.

private void Repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
{ 

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

Die Repeater_ItemDataBound geschieht, bevor der Benutzer einen beliebigen Text eingegeben hat . Wie kann ich diesen Text im OnClick-Ereignis abrufen, nachdem der Benutzer den Text eingegeben hat? – Espo

+0

Hi Espo Sie müssten eine rekursive Methode schreiben, um in der Repeater1.Controls-Auflistung nach einem Textfeld namens TextBox1 zu suchen. Sie könnten es schneller machen, indem Sie zuerst nur in die Fußzeile schauen. –

+0

Ray: Das ist die Lösung, die ich jetzt benutze, aber es scheint "schmutzig" zu sein, eine rekursive Funktion zu erstellen, nur um einen Wert aus einer Textbox zu erhalten. Ich hatte gehofft, dass es einen saubereren Weg geben würde. – Espo

1

Im Repeater finden Sie Steuerelemente. Das gibt Ihnen alle Steuerelemente im Repeater (RepeaterItems Sammlung). Jetzt können Sie etwas tun:

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

Die Fußzeile sollte das letzte Kind die Kontrolle über den Repeater, so dass Sie etwas tun können, wie ..

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