Asp.net FindControl в любом месте под определенным элементом

Скажем, у меня есть эта структура разметки

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

1 ответ

Объявите метод расширения следующим образом:

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();
 }
}
</control></control>

Затем выполните:

var foundControl = e.Item.FindControl("tableHolder").FindAny("panelToFind");

Примечание будет возвращать значение null, если с этим идентификатором не существует никакого элемента управления.

licensed under cc by-sa 3.0 with attribution.