如何在中继器页眉或页脚中找到控件

我想知道如何找到控件的 HeaderTemplate 或 FooterTemplate 的一个 Asp.Net 转发器控件。

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

注意: 我在找到答案后把这个问题贴在这里,只是为了记住它(也许其他人会觉得这个有用)。

107962 次浏览

正如注释中指出的那样,这只有在您绑定了中继器之后才能正常工作。

标题中查找控件:

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 事件的控件上获取引用,然后在以后使用它。

更好的解决办法

您可以在 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);
}
}

在转发器中查找控件(页眉、项目、页脚)

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

Try to make it work with footer, and items controls too =)

实现这一点的最佳和干净的方法是在 Item _ Created Event 中:

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

查找并强制转换控件(基于 Piyey 的 VB 答案)

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