2011-04-26 2 views
0

중첩 된 아코디언 아코디언 웹 컨트롤 (중첩 된 3 또는 때로는 4 깊이)이 중첩 된 아코디언의 상위 아코디언을 찾으려고합니다. 나는 가장 깊은 아코디언 중 하나가 데이터 바인딩 될 때 이것을하고 싶다.중첩 된 아약스 아코디언 웹 컨트롤을 위쪽으로 탐색합니다. 유형 검사 및 FindControl

protected void grandChildAccordion_ItemDataBound(object sender, AjaxControlToolkit.AccordionItemEventArgs e) 
{ 
    if (e.AccordionItem.ItemType == AjaxControlToolkit.AccordionItemType.Header) 
    { 
     // find parent accordion 
    } 
} 

때로는 부모 아코디언 e.AccordionItem.Parent.Parent.Parent 수준이나 e.AccordionItem.Parent.Parent.Parent.Parent 수준에있을 것입니다.

따라서 e.AccordionItem.ParentAjaxControlToolkit.AccordionContentPanel "type"과 같은지 어떻게 확인합니까?

(그다지 우아하지 않음) 해결 방법 : 내가 아코디언을 중첩 한 깊은 가장 아코디언 수준은 문서의 목록을 포함하고, 각 아코디언 헤더 내에 중첩 된 문서의 수를 표시하는 라벨을 가지고있다. 문서 수를 얻는 가장 아코디언 수준부터 시작하여 중첩 된 아코디언을 탐색하고 각 아코디언 머리글을 찾아 내게 문서 수 백분율 레이블을 찾아 값을 추가 할 수있게했습니다.이 도움이 사람에게 도움이되기를 바랍니다 :

// Save doc count. It will be displayed in doc count label within current accordion header, and the value will then be added to the doc count of each parent accordion's header. 
int curDocCount = qcDocsBO.FetchQCDocumentCountByProjectID(SessionHandler.ProjectID, qcDocsBO.LSDItemID); 
lblDocCount.Text = curDocCount.ToString(); 

// A deep-most accordion has just been DataBound. Start traversing upwards through nested accordions, adding the doc count to each parent accordion header's doc count label. 
AjaxControlToolkit.Accordion curAccordion = sender as AjaxControlToolkit.Accordion; 
AjaxControlToolkit.AccordionPane parentAccCP = curAccordion.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane; 
if (parentAccCP == null) 
    parentAccCP = curAccordion.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane; 
while (parentAccCP != null) 
{ 
    Label parentDocCountLabel = (Label)parentAccCP.FindControl("lblDocCount"); 
    if (parentDocCountLabel.Text == "") 
     parentDocCountLabel.Text = "0"; 
    parentDocCountLabel.Text = (Convert.ToInt32(parentDocCountLabel.Text) + curDocCount).ToString(); 

    AjaxControlToolkit.AccordionPane nextParentAccCP = parentAccCP.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane; 

    if (nextParentAccCP == null) 
     nextParentAccCP = parentAccCP.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane; 
    if (nextParentAccCP == null) 
     nextParentAccCP = parentAccCP.Parent.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane; 
    if (nextParentAccCP == null) 
     nextParentAccCP = parentAccCP.Parent.Parent.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane; 
    if (nextParentAccCP != null) 
     parentAccCP = nextParentAccCP; 
    else 
     parentAccCP = null; 
} 

답변

0

당신은 항상 as 키워드를 사용하여 is 키워드 또는 안전 캐스트를 사용하여 검사를 입력 할 수 있습니다. 안전 캐스트가 성공하지 못한 경우

if(e.AccordionItem.Parent is AjaxControlToolkit.AccordionContentPanel) { 
    ... 
} 

또는이

var accordion = e.AccordionItem.Parent as AjaxControlToolkit.AccordionContentPanel; 
if(accordion != null) { 
    ... 
} 

accordion가 null :

는 다음과 같은 고려하십시오.

이러한 기술 중 하나 또는 둘 모두를 사용하면 계층 구조에서 위쪽으로 반복하고 찾고있는 유형을 만날 때 중지 할 수 있습니다.

+0

감사합니다. 덕분에 C 지식에 큰 차이가 생겼습니다. – BumbleB2na

+0

항상 도움이됩니다. 또한'is'와'as' 키워드는 상속 체인에서 위쪽으로 평가됩니다. 예 :'e.AccordionItem.Parent is AjaxControlToolkit.AccordionContentPanel'은 true 일 수 있지만'e.AccordionItem.Parent is WebControl' 또한 true 일 수 있습니다. 그것은 기본적으로 표준 OOP 사고입니다 - 원숭이 *는 영장류이지만 동물이기도합니다. * exact * 타입을 체크하기 위해서는'GetType' 메소드를 사용하십시오. –

+0

알겠습니다. 그 점에 대해 대단히 감사합니다. – BumbleB2na