반복기 머리글 또는 바닥 글에서 컨트롤을 찾는 방법


120

Asp.Net Repeater 컨트롤의 HeaderTemplate 또는 FooterTemplate에서 컨트롤을 찾는 방법이 궁금합니다.

ItemDataBound 이벤트에서 액세스 할 수 있지만 나중에 가져 오는 방법이 궁금합니다 (예 : 머리글 / 바닥 글에서 입력 값 검색).

참고 : 답을 찾은 후 여기에이 질문을 게시하여 기억하도록했습니다 (다른 사람들이 유용하다고 생각할 수도 있음).

답변:


175

주석에서 언급했듯이 이것은 리피터를 DataBound 한 후에 만 ​​작동합니다.

헤더 에서 컨트롤을 찾으려면 :

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

바닥 글 에서 컨트롤을 찾으려면 :

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

확장 방법으로

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

약간 까다로운 메모-바닥 글 예제에서 Controls [0]의 "c"를 대문자로 표기해야합니다.
Mike Cole

8
이 대답은 눈이 아파요.
Lloyd Powell 2011

10
이것은 훌륭하게 작동합니다. 단 하나의 메모-이것은 리피터를 데이터 바인딩 한 후에 만 ​​작동합니다.
아론

2
이건 정말 못생긴 방법인데 ...하지만 저에게는 효과가 있습니다. 정말 감사합니다! 가능하면 +1 이상 줄 것입니다.
Cruril

좋습니다. 실행중인 코드입니다.
Mohammad Jahangeer Ansari

53

더 나은 솔루션

ItemCreated 이벤트에서 항목 유형을 확인할 수 있습니다.

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
당신은 구체적으로 ItemDataBound라고 말했습니다. 이것은 ItemCreated, upvote입니다.
Roberto Alarcon 2011

3
동의하고 훨씬 더 나은 솔루션입니다. 컨트롤에 대한 참조를 저장하십시오.
Sprintstar

1
이것이 훨씬 더 좋은 방법입니다.
Tomas Beblar 2015 년

5

ItemCreated 이벤트의 컨트롤에 대한 참조를 가져온 다음 나중에 사용할 수 있습니다.


13
나중에 어떻게 액세스 할 것인지 물었을뿐입니다. 그 시점에서 나중에 사용할 참조 설정에 대한 pascal의 대답은 완벽하게 유효합니다.
Kasaku 2011 년

4

반복기로 컨트롤 찾기 (머리글, 항목, 바닥 글)

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

이것은 VB.NET에 있으며 필요한 경우 C #으로 변환하십시오.

<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

그리고 쉽게 사용하십시오.

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

바닥 글과 항목 컨트롤도 함께 작동하도록하십시오 =)


2

이를 수행하는 가장 좋고 깨끗한 방법은 Item_Created 이벤트 내에 있습니다.

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

컨트롤을 찾아 캐스팅합니다. (Peyey의 VB 답변을 기반으로 함)


0

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");
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.