2009-01-30 20 views
5

Tôi cần lấy giá trị từ hộp văn bản bên trong FooterTemplate trong sự kiện OnClick của một nút. Suy nghĩ đầu tiên của tôi là lặp qua các item-property trên repeater của tôi, nhưng như bạn có thể thấy trong ví dụ này, nó chỉ bao gồm các mục databound thực tế, không phải là footer-item.Tại sao chân trang không có trong 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); 
} 

Mã này sẽ chỉ ra "2" như đếm, vì vậy làm thế nào để tôi nhận được để tham khảo textbox của tôi bên trong footertemplate ?

Trả lời

1

Từ MSDN documentation, các mục chỉ đơn giản là một bộ RepeaterItems dựa trên DataSource mà bạn đang ràng buộc và không bao gồm các mục trong Header hoặc FooterTemplates.

Nếu bạn muốn tham khảo hộp văn bản, bạn có thể nhận tham chiếu về sự kiện ItemDataBound từ bộ lặp nơi bạn có thể kiểm tra chân trang.

Ví dụ:

private void Repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
{ 

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

Các Repeater_ItemDataBound xảy ra trước khi người dùng đã nhập bất kỳ văn bản . Làm thế nào tôi có thể nhận được văn bản đó trong sự kiện OnClick sau khi người dùng đã nhập văn bản? – Espo

+0

Hi Espo Bạn sẽ cần phải viết một phương thức đệ quy để tìm hiểu về kiểm tra bộ sưu tập Repeater1.Controls cho một hộp văn bản có tên là TextBox1. Bạn có thể làm cho nó nhanh hơn bằng cách chỉ nhìn vào chân trang đầu tiên. –

+0

Ray: Đó là giải pháp tôi đang sử dụng bây giờ, nhưng có vẻ như "bẩn" để tạo ra một hàm đệ quy chỉ để có được một giá trị từ một hộp văn bản. Tôi đã hy vọng sẽ có một cách sạch hơn để làm điều đó. – Espo

1

Bạn có thể tìm thấy điều khiển trong bộ lặp. Điều đó sẽ cung cấp cho bạn tất cả các điều khiển trong bộ lặp (bộ sưu tập RepeaterItems). Bây giờ bạn có thể làm một cái gì đó như thế này:

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

Các chân nên việc kiểm soát con cuối cùng của bộ lặp, do đó bạn có thể làm điều gì đó như ..

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"; 
    } 
} 
Các vấn đề liên quan