1

假设我有这个标记结构

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

4

1 回答 1

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 的控件,Note 将返回 null。

于 2013-08-15T13:14:05.743 回答