Asp.net FindControl位于特定元素下的任意位置
本文关键字:任意 位置 元素 于特定 net FindControl Asp | 更新日期: 2023-09-27 18:27:42
假设我有这个标记结构
<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 ...
一样浏览所有元素来找到这个元素,我想在tableHolder面板下找到id为panelToFind的任何东西,我的ItemDataBound事件会是什么样子?
我想知道是否有类似的东西:e.Item.FindControl("tableHolder").FindAny("panelToFind")
声明这样的扩展方法:
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不存在控件,则Note将返回null。