如何查找中继器页眉或页脚中的控件

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

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

注:我发现这个问题后find答案,以便我记得(也许其他人可能会觉得这有用)。

正如在评论中指出的,这只有在你有DataBound中继器之后才能正常工作。

标题中find一个控件:

lblControl = repeater1.Controls[0].Controls[0].FindControl("lblControl"); 

要在页脚中find控件,请执行以下操作:

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

解决scheme更好

您可以检查ItemCreated事件中的项目types:

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

您可以参考ItemCreated事件上的控件,然后稍后使用它。

find控制到中继器(页眉,项目,页脚)

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

最好和干净的方法是在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; } } 

这是在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 

尝试使它与页脚一起工作,并且项目控件也是=)