如何查找中继器页眉或页脚中的控件
我想知道如何在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
尝试使它与页脚一起工作,并且项目控件也是=)