Asp.net FindControl在特定元素下的任何位置

时间:2013-08-15 12:43:50

标签: c# asp.net webforms repeater

假设我有这个标记结构

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

1 个答案:

答案 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。