Як знайти елементи керування у заголовку чи нижньому колонтитулі ретранслятора


120

Мені було цікаво, як можна знайти елементи керування в HeaderTemplate або FooterTemplate елемента керування AspectNet Repeater.

Я можу отримати доступ до них під час події ItemDataBound, але мені було цікаво, як отримати їх після (наприклад, отримати значення вхідних даних у колонтитулі / колонтитулі).

Примітка. Це питання я розмістив тут, знайшовши відповідь просто для того, щоб запам'ятати його (і, можливо, інші люди можуть вважати це корисним).

Відповіді:


175

Як зазначається в коментарях, це працює лише ПІСЛЯ, коли ви будете переповнювати дані.

Щоб знайти елемент управління в заголовку :

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

Лише невелика прискіплива примітка - у прикладі нижнього колонтитулу вам потрібно використовувати велику літеру "c" у Controls [0].
Майк Коул

8
Ця відповідь болить мої очі.
Ллойд Пауелл

10
Це чудово працює. Лише одна примітка - це працює лише ПІСЛЯ у вас даних, пов’язаних із ретранслятором.
Аарон

2
Це такий некрасивий спосіб зробити це ... Але це працює на мене. Дякую тобі, чоловіче! Я дав би вам більше +1, якщо можливо.
Cruril

Добре, це діючий кодекс ..
Мохаммед Джахагер Ансарі

53

Краще рішення

Ви можете перевірити тип предмета в події 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
Ви спеціально сказали ItemDataBound, це ItemCreate, upvote.
Роберто Аларкон

3
Погоджене, набагато краще рішення. Просто збережіть посилання на елемент управління.
Sprintstar

1
Це набагато кращий спосіб зробити це.
Томаш Беблар

5

Ви можете взяти посилання на елемент керування події ItemCreate, а потім використовувати його пізніше.


13
Ви просто запитали, як би ви отримали доступ до нього пізніше, відповідь, яку дав паскаль відповіді про встановлення посилання в той момент, щоб використовувати його згодом, цілком вірна.
Касаку

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

Знаходить і відкидає контроль. (Спираючись на відповідь Vye Piyey)


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");
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.