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")

Asp.net FindControl位于特定元素下的任意位置

声明这样的扩展方法:

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。