Cách tìm các điều khiển trong đầu trang hoặc chân trang của bộ lặp


120

Tôi đã tự hỏi làm thế nào người ta sẽ tìm thấy các điều khiển trong HeaderTemplate hoặc FooterTemplate của một điều khiển Bộ lặp Asp.Net.

Tôi có thể truy cập chúng trên sự kiện ItemDataBound, nhưng tôi đang tự hỏi làm cách nào để lấy chúng sau (ví dụ: lấy giá trị của một đầu vào trong đầu trang / chân trang).

Lưu ý: Tôi đã đăng câu hỏi này ở đây sau khi tìm thấy câu trả lời chỉ để tôi nhớ nó (và có thể những người khác có thể thấy điều này hữu ích).

Câu trả lời:


175

Như đã lưu ý trong các nhận xét, điều này chỉ hoạt động SAU KHI bạn đã DataBound bộ lặp của mình.

Để tìm một điều khiển trong tiêu đề :

lblControl = repeater1.Controls[0].Controls[0].FindControl("lblControl");

Để tìm một điều khiển ở chân trang :

lblControl = repeater1.Controls[repeater1.Controls.Count - 1].Controls[0].FindControl("lblControl");

Với các phương pháp mở rộng

public static class RepeaterExtensionMethods
{
    public static Control FindControlInHeader(this Repeater repeater, string controlName)
    {
        return repeater.Controls[0].Controls[0].FindControl(controlName);
    }

    public static Control FindControlInFooter(this Repeater repeater, string controlName)
    {
        return repeater.Controls[repeater.Controls.Count - 1].Controls[0].FindControl(controlName);
    }
}

Chỉ là một lưu ý nhỏ - Bạn cần viết hoa chữ "c" trong Controls [0] trong ví dụ ở chân trang của bạn.
Mike Cole

8
Câu trả lời này làm tôi nhức mắt.
Lloyd Powell

10
Điều này hoạt động tốt. Chỉ một lưu ý - điều này chỉ hoạt động SAU KHI bạn đã lập dữ liệu bộ lặp của mình.
Aaron

2
Đây là một cách xấu xí để làm điều này ... Nhưng nó hiệu quả với tôi. Cảm ơn người đàn ông rất nhiều! Tôi sẽ cung cấp cho bạn nhiều hơn +1 nếu có thể.
Cruril

Tốt, đây là một Mã đang chạy ..
Mohammad Jahangeer Ansari

53

Giải pháp tốt hơn

Bạn có thể kiểm tra loại mục trong sự kiện ItemCreate:

protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e) {
    if (e.Item.ItemType == ListItemType.Footer) {
        e.Item.FindControl(ctrl);
    }
    if (e.Item.ItemType == ListItemType.Header) {
        e.Item.FindControl(ctrl);
    }
}

4
Bạn đã nói cụ thể ItemDataBound, đây là ItemCreate, upvote.
Roberto Alarcon

3
Đồng ý, giải pháp tốt hơn nhiều. Chỉ cần lưu một tham chiếu đến điều khiển.
Sprintstar

1
Đây là một cách tốt hơn nhiều để làm điều đó.
Tomas Beblar

5

Bạn có thể tham khảo điều khiển trên sự kiện ItemCreate, sau đó sử dụng nó sau.


13
Bạn chỉ đơn giản hỏi bạn sẽ truy cập nó như thế nào sau này, câu trả lời mà pascal đưa ra về việc thiết lập một tham chiếu tại thời điểm đó để sử dụng sau đó là hoàn toàn hợp lệ.
Kasaku

4

Tìm điều khiển vào Bộ lặp (Đầu trang, Mục, Chân trang)

public static class FindControlInRepeater
{
    public static Control FindControl(this Repeater repeater, string controlName)
    {
        for (int i = 0; i < repeater.Controls.Count; i++)
            if (repeater.Controls[i].Controls[0].FindControl(controlName) != null)
                return repeater.Controls[i].Controls[0].FindControl(controlName);
        return null;
    }
}

2

Đây là trong VB.NET, chỉ cần dịch sang C # nếu bạn cần:

<Extension()>
Public Function FindControlInRepeaterHeader(Of T As Control)(obj As Repeater, ControlName As String) As T
    Dim ctrl As T = TryCast((From item As RepeaterItem In obj.Controls
                   Where item.ItemType = ListItemType.Header).SingleOrDefault.FindControl(ControlName),T)
    Return ctrl
End Function

Và sử dụng nó dễ dàng:

Dim txt as string = rptrComentarios.FindControlInRepeaterHeader(Of Label)("lblVerTodosComentarios").Text

Cố gắng làm cho nó hoạt động với footer và các điều khiển các mục nữa =)


2

Cách tốt nhất và rõ ràng để làm điều này là trong Sự kiện Item_Create:

 protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e)
        {
            switch (e.Item.ItemType)
            {
                case ListItemType.AlternatingItem:
                    break;
                case ListItemType.EditItem:
                    break;
                case ListItemType.Footer:
                    e.Item.FindControl(ctrl);
                    break;
                case ListItemType.Header:
                    break;
                case ListItemType.Item:
                    break;
                case ListItemType.Pager:
                    break;
                case ListItemType.SelectedItem:
                    break;
                case ListItemType.Separator:
                    break;
                default:
                    break;
            }
    }

0
private T GetHeaderControl<T>(Repeater rp, string id) where T : Control
{
    T returnValue = null;
    if (rp != null && !String.IsNullOrWhiteSpace(id))
    {
        returnValue = rp.Controls.Cast<RepeaterItem>().Where(i => i.ItemType == ListItemType.Header).Select(h => h.FindControl(id) as T).Where(c => c != null).FirstOrDefault();
    }
    return returnValue;
}

Tìm và sử dụng điều khiển. (Dựa trên câu trả lời VB của Piyey)


0

Đối với ItemDataBound

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)//header
    {
            Control ctrl = e.Item.FindControl("ctrlID");
    }
    else if (e.Item.ItemType == ListItemType.Footer)//footer
    {
            Control ctrl = e.Item.FindControl("ctrlID");
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.