如何在转发器的页眉或页脚中查找控件


120

我想知道如何在Asp.Net Repeater控件的HeaderTemplate或FooterTemplate中找到控件。

我可以在ItemDataBound事件上访问它们,但是我想知道之后如何获取它们(例如,检索页眉/页脚中输入的值)。

注意:我在找到答案后才在此处发布此问题,以便记住它(也许其他人可能会觉得有用)。

Answers:


174

如评论中所述,只有在使用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 2010年

8
这个回答让我很伤心。
Lloyd Powell

10
这很好。仅需注意一个便笺-仅在您对中继器进行数据绑定后才能使用。
亚伦

2
这是这样做的丑陋方式...但这对我有用。非常感谢你!如果可以的话,我会给你更多的+1。
Cruril

好,这是一个正在运行的代码..
穆罕默德·安萨里Jahangeer

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,赞成。
罗伯托·阿拉尔孔

3
同意,更好的解决方案。只需保存对控件的引用。
Sprintstar 2012年

1
这是一种更好的方法。
Tomas Beblar 2015年

5

您可以在控件上引用ItemCreated事件,然后在以后使用它。


13
您只是问过以后如何使用它,pascal给出的在那时设置引用以供以后使用的答案是完全有效的。
Kasaku 2011年

4

在Repeater(页眉,项目,页脚)中找到控件

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

查找并强制转换控件。(基于Piyey的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");
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.