2009-01-30 18 views
5

Bir düğmenin OnClick olayında bir FooterTemplate içindeki bir metin kutusundan bir değer almam gerekiyor. İlk düşüncem tekrarlayıcıda bulunan öğeler-özellik üzerinden dönmekti, ancak bu örnekte de görebileceğiniz gibi, sadece alt öğe değil, gerçek veri maddelerini içerir.Alt öğe niçin Repeater.Items'e dahil edilmiyor?

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

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

Bu kod sadece çıkış "2" sayısı olarak, peki nasıl FooterTemplate içinde benim metin kutusu başvurmak için alabilirim olacak ?

cevap

1

MSDN documentation'dan itibaren, Öğeler, bağlandığınız ve Header veya FooterTemplates öğelerindeki öğeleri içermeyen DataSource'u temel alan bir RepeaterItems kümesidir.

Metin kutusuna başvurmak isterseniz, altbilgiyi test edebileceğiniz yineleyiciden ItemDataBound olayıyla ilgili bir başvuru alabilirsiniz.

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

Repeater_ItemDataBound olur kullanıcı herhangi metni girdi önce . Kullanıcı metni girdikten sonra bu metni OnClick etkinliğine nasıl alabilirim? – Espo

+0

Merhaba Espo TextBox1 adındaki bir metin kutusunu kontrol etmek için Repeater1.Controls koleksiyonunu incelemek üzere bir özyineleme yöntemi yazmanız gerekir. İlk önce yalnızca altbilgiye bakarak daha hızlı yapabilirsiniz. –

+0

Ray: Şu an kullandığım çözüm bu, ama sadece bir metin kutusundan bir değer elde etmek için özyinelemeli bir işlev yaratmak için "kirli" görünüyor. Bunu yapmanın daha temiz bir yolu olacağını umuyordum. – Espo

1

Tekrarlayıcıda denetimleri bulabilirsiniz. Bu size tekrarlayıcıdaki tüm kontrolleri verecektir (RepeaterItems koleksiyonu). Şimdi böyle bir şey yapabilirsiniz:

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

altbilgi gibi bir şey yapabilirsiniz, böylece repeaterin son çocuk kontrolünü olmalıdır ..

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