2009-07-29 6 views
23

Tôi có bộ lặp sau đây và tôi đang cố gắng tìm lblA ở mã phía sau và nó không thành công. Dưới đây đánh dấu là những nỗ lực tôi đã thực hiện:Không thể tìm thấy quyền kiểm soát trong bộ lặp asp.net?

<asp:Repeater ID="rptDetails" runat="server"> 
    <HeaderTemplate> 
     <table> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td><strong>A:</strong></td> 
      <td><asp:Label ID="lblA" runat="server"></asp:Label> 
      </td> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater> 
</table> 

Trước tiên tôi cố gắng,

Label lblA = (Label)rptDetails.FindControl("lblA"); 

nhưng lblA là vô

Sau đó, tôi cố gắng,

Label lblA = (Label)rptDetails.Items[0].FindControl("lblA"); 

nhưng Items là 0 mặc dù m repeater chứa 1 itemtemplate

Trả lời

28

Bạn cần phải thiết lập các thuộc tính OnItemDataBound="myFunction"

Và sau đó trong mã của bạn thực hiện như sau

void myFunction(object sender, RepeaterItemEventArgs e) 
{ 
    Label lblA = (Label)e.Item.FindControl("lblA"); 
} 

Ngẫu nhiên bạn có thể sử dụng phương pháp tương tự chính xác này cho bộ lặp lồng nhau. IE:

<asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerFunction"> 
<ItemTemplate> 
    <asp:Repeater ID="innerRepeater" runat="server" OnItemDataBound="innerFunction"> 
    <ItemTemplate><asp:Label ID="myLabel" runat="server" /></ItemTemplate> 
    </asp:Repeater> 
</ItemTemplate> 
</asp:Repeater> 

Và sau đó trong mã của bạn:

void outerFunction(object sender, RepeaterItemEventArgs e) 
{ 
    Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater"); 
    innerRepeater.DataSource = ... // Some data source 
    innerRepeater.DataBind(); 
} 
void innerFunction(object sender, RepeaterItemEventArgs e) 
{ 
    Label myLabel = (Label)e.Item.FindControl("myLabel"); 
} 

Tất cả các quá thường xuyên tôi thấy mọi người tự ràng buộc mục trên một repeater bên trong và họ không nhận ra khó khăn như thế nào họ đang làm cho mọi thứ cho bản thân .

+0

Tôi là một chút bối rối. Những gì tôi đang thực sự làm là khi tôi nhấp vào liên kết Xem chi tiết trên 1 trang, nó sẽ đưa tôi đến chế độ xem chi tiết trên trang khác có bộ lặp và trong page_load, tôi đang cố định vị trí lblA – Xaisoft

+0

Đã chỉnh sửa. Hy vọng rằng điều đó giải thích thêm một chút. –

+0

Ok, những gì tôi đã làm là di chuyển một biến DataTable đến cấp cao nhất của lớp. Sau đó, tôi đã tạo ItemDataBoundEvent và trong đó tôi đã kiểm tra lblA trong bộ lặp và nếu nó tìm thấy nó, hãy đặt nó vào một số văn bản mà tôi đã lấy lại từ một hàng trong DataTable. Tôi có đúng trong sự hiểu biết của tôi về điều này? Cảm ơn – Xaisoft

1

Mã cho VB.net

Protected Sub rptDetails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptDetails.ItemDataBound  
     If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then 
     Dim lblA As Label = CType(e.Item.FindControl("lblA"), Label) 
     lblA.Text = "Found it!" 
     End If 
    End Sub 
0

Bạn nên ràng buộc đầu tiên.
chẳng hạn)

rptDetails.DataSource = dataSet.Tables["Order"]; 

rptDetails.DataBind(); 
7

Tôi vừa gặp phải vấn đề tương tự.

Chúng tôi thiếu loại loại trong khi lặp trong các mục. Mục đầu tiên trong bộ lặp là tiêu đề và tiêu đề không có các yếu tố asp mà chúng tôi đang tìm kiếm.

Hãy thử điều này:

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");} 
+0

cảm ơn người đàn ông, tôi có cùng một vấn đề và tôi dành rất nhiều thời gian để tìm ra vấn đề. SO là tuyệt vời !! – Kamran

+0

ditto - điều này thực sự cần phải được đưa vào ví dụ của MSDNs ... nhưng chúng ta nên mong đợi điều gì từ huh? – Rich