Как найти элементы управления в верхнем или нижнем колонтитуле ретранслятора
Мне было интересно, как можно найти элементы управления в HeaderTemplate или FooterTemplate элемента управления Repater Asp.Net.
Я могу получить к ним доступ по событию ItemDataBound, но мне было интересно, как их получить после (например, для получения значения ввода в верхнем / нижнем колонтитуле).
Примечание: я разместил этот вопрос здесь после нахождения ответа только для того, чтобы я его запомнил (и, возможно, другие люди могут найти это полезным).
8 ответов
Как отмечено в комментариях, это работает только после того, как вы привязали свой ретранслятор к DataBound.
Чтобы найти элемент управления в шапке:
lblControl = repeater1.Controls[0].Controls[0].FindControl("lblControl");
Чтобы найти элемент управления в нижнем колонтитуле:
lblControl = repeater1.Controls[repeater1.Controls.Count - 1].Controls[0].FindControl("lblControl");
С методами расширения
public static class RepeaterExtensionMethods
{
public static Control FindControlInHeader(this Repeater repeater, string controlName)
{
return repeater.Controls[0].Controls[0].FindControl(controlName);
}
public static Control FindControlInFooter(this Repeater repeater, string controlName)
{
return repeater.Controls[repeater.Controls.Count - 1].Controls[0].FindControl(controlName);
}
}
Лучшее решение
Вы можете проверить тип элемента в событии ItemCreated:
protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e) {
if (e.Item.ItemType == ListItemType.Footer) {
e.Item.FindControl(ctrl);
}
if (e.Item.ItemType == ListItemType.Header) {
e.Item.FindControl(ctrl);
}
}
Вы можете получить ссылку на элемент управления события ItemCreated, а затем использовать его позже.
Найти контроль в Repeater (Верхний колонтитул, Предмет, Нижний колонтитул)
public static class FindControlInRepeater
{
public static Control FindControl(this Repeater repeater, string controlName)
{
for (int i = 0; i < repeater.Controls.Count; i++)
if (repeater.Controls[i].Controls[0].FindControl(controlName) != null)
return repeater.Controls[i].Controls[0].FindControl(controlName);
return null;
}
}
Это в VB.NET, просто переведите на C#, если вам это нужно:
<Extension()>
Public Function FindControlInRepeaterHeader(Of T As Control)(obj As Repeater, ControlName As String) As T
Dim ctrl As T = TryCast((From item As RepeaterItem In obj.Controls
Where item.ItemType = ListItemType.Header).SingleOrDefault.FindControl(ControlName),T)
Return ctrl
End Function
И использовать это легко:
Dim txt as string = rptrComentarios.FindControlInRepeaterHeader(Of Label)("lblVerTodosComentarios").Text
Попробуй заставить его работать с нижним колонтитулом, а элементы управления тоже =)
Лучший и чистый способ сделать это в рамках события Item_Created:
protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e)
{
switch (e.Item.ItemType)
{
case ListItemType.AlternatingItem:
break;
case ListItemType.EditItem:
break;
case ListItemType.Footer:
e.Item.FindControl(ctrl);
break;
case ListItemType.Header:
break;
case ListItemType.Item:
break;
case ListItemType.Pager:
break;
case ListItemType.SelectedItem:
break;
case ListItemType.Separator:
break;
default:
break;
}
}
private T GetHeaderControl<T>(Repeater rp, string id) where T : Control
{
T returnValue = null;
if (rp != null && !String.IsNullOrWhiteSpace(id))
{
returnValue = rp.Controls.Cast<RepeaterItem>().Where(i => i.ItemType == ListItemType.Header).Select(h => h.FindControl(id) as T).Where(c => c != null).FirstOrDefault();
}
return returnValue;
}
Находит и кастует управление. (Основано на ответе Пиея В.Б.)
Для ItemDataBound
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)//header
{
Control ctrl = e.Item.FindControl("ctrlID");
}
else if (e.Item.ItemType == ListItemType.Footer)//footer
{
Control ctrl = e.Item.FindControl("ctrlID");
}
}