Как найти элементы управления в верхнем или нижнем колонтитуле повторителя

Мне было интересно, как найти элементы управления в HeaderTemplate или FooterTemplate элемента управления Asp.Net Repeater.

Я могу получить к ним доступ в событии ItemDataBound, но мне было интересно, как получить их после (например, чтобы получить значение ввода в верхнем / нижнем колонтитуле).

Примечание: я разместил этот вопрос здесь после того, как нашел ответ, чтобы я его запомнил (и, возможно, другие люди могут найти его полезным).


person mbillard    schedule 31.03.2009    source источник


Ответы (8)


Как отмечено в комментариях, это работает только ПОСЛЕ того, как вы установили 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);
    }
}
person Community    schedule 31.03.2009
comment
Небольшое замечание: в нижнем колонтитуле вам нужно использовать заглавную букву c в Controls [0]. - person Mike Cole; 29.01.2010
comment
Этот ответ режет мне глаза. - person Lloyd Powell; 03.11.2011
comment
Это прекрасно работает. Одно замечание - это работает только ПОСЛЕ того, как вы подключили свой ретранслятор. - person Aaron; 30.08.2012
comment
Это такой уродливый способ сделать это ... Но у меня он работает. Большое спасибо, чувак! Если возможно, я бы поставил вам больше +1. - person Cruril; 01.10.2013

Лучшее решение

Вы можете проверить тип элемента в событии 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);
    }
}
person Behtash Moradi    schedule 21.02.2011
comment
Вы конкретно сказали ItemDataBound, это ItemCreated, проголосуйте за. - person Roberto Alarcon; 20.12.2011
comment
Согласен, гораздо лучшее решение. Просто сохраните ссылку на элемент управления. - person Sprintstar; 18.05.2012
comment
Это гораздо лучший способ сделать это. - person Tomas Beblar; 15.09.2015

Вы можете взять ссылку на элемент управления в событии ItemCreated, а затем использовать его позже.

person pascal    schedule 10.08.2010
comment
Вы просто спросили, как вы получите к нему доступ позже, ответ, который дал Паскаль, о настройке ссылки в этой точке для использования впоследствии, совершенно верен. - person Kasaku; 21.09.2011

Управляйте повторителем (заголовок, элемент, нижний колонтитул)

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;
    }
}
person Chaki_Black    schedule 12.04.2011

Это в 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

Попробуйте заставить его работать с нижним колонтитулом и элементами управления тоже =)

person Piyey    schedule 22.02.2012

Лучший и чистый способ сделать это - в событии 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;
            }
    }
person Sebastien H.    schedule 15.04.2014

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

Находит и применяет контроль. (На основе ответа Piyey VB)

person glboothby    schedule 29.06.2018

Для 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");
    }
}
person Claudinei Ferreira    schedule 01.02.2019