假设我有这个标记结构
<asp:Repeater id="rptItems" datasource="getItemsList()" runat="server" OnItemDataBound="rpAereos_ItemDataBound">
<ItemTemplate>
<asp:Panel id="tableHolder" runat="server">
<asp:table ID="TableHolded" runat="server">
<asp:TableRow>
<asp:TableCell>
<asp:Panel runat="server" ID="panelToFind">Test</asp:Panel>
</asp:TableCell>
</asp:TableRow>
</asp:table>
</asp:Panel>
</ItemTemplate>
</asp:Repeater>
现在在ItemDataBound事件中我想找到元素 panelToFind ,但我不想遍历所有元素来找到像e.Item.FindControl("tableHolder").FindControl("tableHolded").AReallyLongCallChainUntilMyItem ...
这样的元素,我想找到任何东西在具有id panelToFind 的 tableHolder 面板下,我的 ItemDataBound 事件将如何显示?
我想知道是否有:e.Item.FindControl("tableHolder").FindAny("panelToFind")
答案 0 :(得分:2)
声明一个像这样的扩展方法:
public static class ControlExtensions
{
public static IEnumerable<Control> GetEnumerableChildren(this Control control)
{
return control.Controls.Cast<Control>();
}
public static Control FindAny(this Control control, string id)
{
var result = control.GetEnumerableChildren().FirstOrDefault(c => c.ID == id);
if (result != null)
return result;
return control.GetEnumerableChildren().Select(child => child.FindAny(id)).FirstOrDefault();
}
}
然后做:
var foundControl = e.Item.FindControl("tableHolder").FindAny("panelToFind");
如果不存在具有该id的控件,则注意将返回null。