120

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

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

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

4

8 回答 8

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);
    }
}
于 2009-03-31T15:01:40.517 回答
54

更好的解决方案

您可以在 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);
    }
}
于 2011-02-21T03:13:35.720 回答
5

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

于 2010-08-10T12:56:41.083 回答
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;
    }
}
于 2011-04-12T14:43:11.687 回答
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

尝试使其与页脚和项目控件一起使用 =)

于 2012-02-22T23:16:01.557 回答
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;
            }
    }
于 2014-04-15T09:25:47.410 回答
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 答案)

于 2018-06-29T11:28:03.930 回答
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");
    }
}
于 2019-02-01T11:54:30.580 回答