2013-10-30 2 views
1

저는 하나의 ASP 페이지 "childPage.aspx""masterPage.aspx"을 마스터 페이지로 사용합니다. childPage.aspx에는 사용자 (userControl.ascx)가 제어 할 수 있습니다. 이제 사용자 정의 컨트롤에서 childPage.aspx의 컨트롤에 액세스하려고합니다. 나는 다음과 같이 chilPage.aspx 컨트롤에 액세스하려고 :ASP.NET의 UserControl에서 상위 페이지 컨트롤에 액세스하는 방법?

HtmlContainerControl ProductMenu= (HtmlContainerControl)Page.FindControl("ProductMenu"); 

HtmlContainerControl ProductMenu= (HtmlContainerControl)this.Page.FindControl("ProductMenu"); 

HtmlContainerControl ProductMenu= (HtmlContainerControl)Parent.FindControl("ProductMenu"); 

HtmlContainerControl ProductMenu= (HtmlContainerControl)this.Parent.parent.FindControl("ContaintHolder").FindControl("ProductMenu") 

을 위의 코드에서 ProductMenu이 childPage.aspx에서 DIV (RUNAT 서버)의 ID입니다. 이제는 내 사용자 정의 컨트롤에서 액세스하려고하지만 div에 액세스 할 수는 없습니다. 어떻게해야합니까? 미리 감사드립니다.

+0

masterPage.aspx는 아마도 masterPage.Master 일 것입니다. 실제 ASP.NET 마스터 페이지입니까? – Marcel

+1

자식 컨트롤에서 액세스하려는 컨트롤에 대한 참조를 제공하면 훨씬 더 간단하고 단순 해집니다. – Marcel

답변

0

FindControl() 방법이 재귀이 아니기 때문에 이것이 작동하지 않는 이유 일 수 있습니다. MSDN documentation에서 호출됩니다.

이 메서드는 컨트롤이 지정된 컨테이너에 직접 포함되어있는 경우에만 컨트롤을 찾습니다. 즉,이 메서드는 컨트롤 내의 컨트롤 계층을 검색하지 않습니다.

그래서, 예를 들어, Page.FindControls()것이다 Page.Controls 수집에 나열된 컨트롤 만 검색; 해당 컨트롤 각각의 Controls 컬렉션을 검색하지 않습니다. 따라서 Page.FindControl()ProductMenu이 ASPX 페이지의 인 에있는 경우에만 작동합니다. 예를 들어 Panel 컨트롤 내에 중첩 된 경우이 코드는 작동하지 않습니다.

이 문제를 해결하려면 빠른 재귀 함수를 작성하여 컨트롤 트리를 크롤링 할 수 있습니다. 예를 들어 : 귀하의 경우

public Control FindControl(Control control, string name) { 
    foreach (Control childControl in control.Controls) { 
     if (childControl.Id == name) return childControl; 
     Control foundControl = FindControl(childControl, name); 
     if (foundControl != null) return childControl; 
    } 
    return null; 
    } 

, 당신은 항상 HtmlContainerControl의 인스턴스를 찾고있을거야 가정, 당신도 유형을 확인하고 강력한 형식의 객체를 반환 할 수, 당신은 선택해야합니다. 또는 반복적으로이 작업을 수행해야하는 경우 Page 클래스의 확장 메소드로 추가하여 여러 페이지에서 쉽게 액세스 할 수 있습니다.

관련 문제