페이지에 컨트롤을 찾으려면, 그것은이 같은 서버 컨트롤, 수있다 : 페이지
<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에는 웹 컨트롤을위한 모든 것이 있습니다.
페이지 수명주기의 어느 부분에서 클라이언트 측로드 된 DOM에 대한 요청 서버 측을 만들 것인가? –
데이터 집합이 너무 커서 한 번에로드 할 수없는 트리에 표시되므로 사용자가 데이터를 확장 할 때 각 노드를 즉시로드합니다. – Praesagus