2009-08-03 4 views
4

ID없이 C# (런타임)의 컨트롤을 어떻게 참조합니까?C# 컨트롤 및 컨트롤 참조 찾기

예를 들어, 하나의 테이블이있는 페이지가 있습니다. xmlhttp를 사용하여이 페이지를 재귀 적으로로드하므로이 ID를 사용하는 테이블을 참조 할 수 없습니다. this.Page.Controls[2]의 효과가 있습니까? 또는 Controls["Tables"][0]?

나는 이름 this.Controls.Find("MyTableName", true);를 사용하여 시도했지만 라이브러리 System.Windows.Forms (나는 생각한다)에 대한 참조가 필요하지만 'using System.' 인텔리 그것을 볼 수 없습니다로 추가하는 방법을 모르겠어요.

this.Controls에있는 모든 컨트롤을 반복했지만 ID는 검색 만 가능하므로 'system.ui.web.control' does not contain a definition for '.Name'입니다.

저는이 말을 처음 접했고 그 해결책은 분노하게 간단하다고 확신합니다. 사전에
감사

+0

페이지 수명주기의 어느 부분에서 클라이언트 측로드 된 DOM에 대한 요청 서버 측을 만들 것인가? –

+0

데이터 집합이 너무 커서 한 번에로드 할 수없는 트리에 표시되므로 사용자가 데이터를 확장 할 때 각 노드를 즉시로드합니다. – Praesagus

답변

12

페이지에 컨트롤을 찾으려면, 그것은이 같은 서버 컨트롤, 수있다 : 페이지

<asp:Table runat="server"> 
    ... 
</asp:Table> 

정기적 인 HTML이 아닌 "컨트롤", 그들은 단지 텍스트입니다 브라우저로 전송됩니다. 반면 서버 컨트롤은 코드 숨김과 상호 작용할 수있는 실제 .NET 클래스입니다.

컨테이너의 Controls 컬렉션을 검색하거나 페이지를 반복적으로 검색하여 ID없이이 컨트롤을 처리 할 수 ​​있습니다. Controls 컬렉션을 재귀 적으로 검색하는 것으로 시작해 보겠습니다.

컨트롤 컬렉션은 주어진 컨트롤의 자식 컨트롤 인 즉치만을 참조합니다. 또는 페이지의 직접적인 아동 통제. 그 컨트롤 은 차례로에 자식 컨트롤이 있습니다. 그것은 메모리에있는 트리를 나타냅니다.

private Control FindControlRecursive(Control control, string id) 
{ 
    Control returnControl = control.FindControl(id); 
    if (returnControl == null) 
    { 
     foreach (Control child in control.Controls) 
     { 
      returnControl = child.FindControlRecursive(id); 
      if (returnControl != null && returnControl.ID == id) 
      { 
       return returnControl; 
      } 
     } 
    } 
    return returnControl; 
} 

(이 응답의 범위를 넘어,이가 extension method로 더 잘 수행된다) 여기

는 ID의 제어를 소정의 제어 중 나무를 재귀 및 검색하는 방법이다.

가 ID가 아닌 다른 무언가에 의해 제어를 찾으려면, 당신은 유형별로 검색 할 수 있습니다 :이 일반적으로 아주 좋은 생각이 아니라고

if(someControl is System.Web.UI.WebControls.Table) 

참고. 이 방법으로 컨트롤을 검색해야하는 경우에는 좋은 패턴이 아닙니다. 컨트롤에 대한 ID가 있어야하며 그렇지 않으면 코드에서 작성 되었기 때문에 참조가 있어야합니다. 당신은 확실히하지

private Control FindControl<T>(Control startFrom) 
{ 
    foreach(Control child in startFrom.Controls) 
    { 
     if(child.GetType().IsAssignableFrom(typeof(T))) 
     { 
      return child; 
     } 
     else 
     { 
      return FindControl<T>(child); 
     } 
    } 
    return null; 
} 

:

private Control FindTable(Control startFrom) 
{ 
    foreach(Control child in startFrom.Controls) 
    { 
     if(child is System.Web.UI.WebControls.Table) 
     { 
      return child; 
     } 
     else 
     { 
      return FindTable(child); 
     } 
    } 
    return null; 
} 

당신은 또한 일반이 방법의 양식을 할 수 :

그러나, 재귀 적 유형을 검색하는 방법을 수정하는 간단 WinForms 응용 프로그램의 모든 코드를 포함하기 만하면 System.Windows.Forms를 포함하려고합니다. Visual Studio가 웹 프로젝트에 포함시키지 않은 이유입니다. 필요하지 않을 것입니다. System.Web.UI에는 웹 컨트롤을위한 모든 것이 있습니다.

+0

왜 downvote? –

+0

나는 왜 그의 대답을 삭제 한 남자에게서 downvote - 신 포도를 몰라요? 그래서 당신의 아이디어를 사용하여 어떤 타입의 인자 타입을 제네릭 타입으로 정의 할 것인가를 결정할 수 있습니다. 그래서 다른 타입의 컨트롤도 보낼 수 있습니다. if (myControl arg)? – Praesagus

+0

@Praesagus ID 대신 유형별로 검색하여 데모 코드를 추가했습니다. 그래도이 방법을 사용하지 않는 것이 좋습니다 ... –