programing

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

goodsources 2023. 6. 10. 09:02
반응형

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

Asp의 HeaderTemplate 또는 FooterTemplate에서 컨트롤을 어떻게 찾을 수 있는지 궁금합니다.Net Repeater 컨트롤.

ItemDataBound 이벤트에서 액세스할 수 있지만, 헤더/푸터에서 입력 값을 검색하는 등의 방법으로 액세스할 수 있습니다.

참고: 이 질문은 제가 기억하기 위해 답을 찾은 후에 여기에 올렸습니다(아마도 다른 사람들은 이것이 유용하다고 생각할 것입니다).

코멘트에 명시된 대로, 이것은 당신이 당신의 중계기를 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);
    }
}

더 나은 솔루션

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

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

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

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

이것은 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

바닥글과 함께 작동하도록 시도하고 항목도 제어합니다. =)

이 작업을 수행하는 가장 좋은 방법은 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;
            }
    }
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;
}

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

항목 데이터 바인딩의 경우

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

언급URL : https://stackoverflow.com/questions/701412/how-to-find-controls-in-a-repeater-header-or-footer

반응형