Asp.Net Repeater 컨트롤의 HeaderTemplate 또는 FooterTemplate에서 컨트롤을 찾는 방법이 궁금합니다.
ItemDataBound 이벤트에서 액세스 할 수 있지만 나중에 가져 오는 방법이 궁금합니다 (예 : 머리글 / 바닥 글에서 입력 값 검색).
참고 : 답을 찾은 후 여기에이 질문을 게시하여 기억하도록했습니다 (다른 사람들이 유용하다고 생각할 수도 있음).
답변
주석에서 언급했듯이 이것은 리피터를 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 이벤트의 컨트롤에 대한 참조를 가져온 다음 나중에 사용할 수 있습니다.
답변
반복기로 컨트롤 찾기 (머리글, 항목, 바닥 글)
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;
}
컨트롤을 찾아 캐스팅합니다. (Peyey의 VB 답변을 기반으로 함)