2012-11-27 2 views
0

사용자 정의 유효성 검사기에서 페이지의 여러 수준 중첩 된 asp.net 컨트롤에 어떻게 액세스합니까?사용자 지정 유효성 검사기에서 중첩 컨트롤에 액세스

특히, 다른 자리 표시 자 내부에있는 다른 중계기 내부에있는 중계기 내부에있는 자리 표시 자 내에있는 드롭 다운 목록을 생성하고 있습니다.

서로 비교하려면 모든 드롭 다운 상자에서 선택한 값에 액세스해야합니다.

For Each g As Control In sender.Parent.Controls 
     If g.GetType().ToString.Equals("System.Web.UI.WebControls.Repeater") Then 
      For Each k As Control In g.Controls 
       If k.GetType().ToString.Equals("System.Web.UI.WebControls.RepeaterItem") Then 
        For Each l As Control In k.Controls 
         If l.GetType().ToString.Equals("System.Web.UI.WebControls.Repeater") Then 
          For Each p As Control In l.Controls 
           If p.GetType().ToString.Equals("System.Web.UI.WebControls.RepeaterItem") Then 
            For Each n As Control In p.Controls 
             If n.GetType().ToString.Equals("System.Web.UI.WebControls.PlaceHolder") Then 
              For Each c As Control In n.Controls 
               If c.GetType().ToString.Equals("System.Web.UI.WebControls.DropDownList") Then 

               'Add the dropdownlist to an array so that I can use it after all drop down lists have been added for validation. 

이 자원의 전체 쓰레기처럼 보인다 : 나는 DropDownList로의 액세스 깊은만큼 아래로 얻을 때까지

나의 현재 솔루션은 각 컨트롤 내부의 모든 컨트롤을 통해 반복하는 것입니다. 사용자 정의 유효성 검사기에서 이러한 컨트롤에 액세스하는 더 좋은 방법이 있습니까?

+0

예 - 재귀. – Igor

답변

0

$을 사용하여 컨테이너 이름을 연결하여 중첩 컨트롤에 액세스 할 수 있다고 생각합니다. 이 같은 :

ControlToValidate="panel1$usercontrol1$otherusercontrol$textbox1" 

이 내부 FindControl() 호출 사고로 이어질는 당신이 드물게이 방법을 사용한다, 그래서 다소 비싼 발리에 의해 수행된다.

일반적으로 다른 컨테이너 내부에있는 중첩 된 컨트롤에 액세스하는 것은 좋지 않습니다. 이러한 컨트롤을 페이지/컨트롤의 비공개 멤버로 취급하고 이러한 방식으로 액세스하지 않아야합니다. 경우에만 위의 방법을 사용하십시오. 실제로는이어야합니다.

편집 :이 방법이 완벽한 해결책은 아니지만 나는 이렇게 할 것입니다. 드롭 다운 목록에서 파생 된 새로운 DropDownListX 컨트롤을 만들어 페이지를 잡고 페이지가 사용자가 만든 새 사용자 지정 인터페이스를 구현하는지 확인합니다. 이 인터페이스는 페이지에 컨트롤을 등록하는 데 사용할 수 있으며 유효성 검사기는이 목록을 통해 등록 된 각 컨트롤의 유효성을 검사 할 수 있습니다. 예 :

페이지에서이 인터페이스를 구현해야합니다. 그런 다음 새로운 DropDownListX 컨트롤 : 유효성 검사가 일어날 때

protected override void OnLoad (EventArgs e) 
{ 
    IValidationProvider oPage = Page as IValidationProvider; 

    if (oPage != null) 
     oPage.RegisterForValidation (this); 
} 

은 다음 페이지에서, 당신은 검증 목록에있는 컨트롤의 목록을 갈 수 있으며, 하나씩 확인합니다. 사용자 지정 유효성 검사기는 ControlToValidate 컨트롤 이름이 하나만있는 것은 아니지만 중첩 된 중계기 내부에있는 여러 컨트롤의 유효성을 검사하는 유효성 검사기가 1 개인 사용자에게 적합합니다.

이 솔루션은 현재의 딥 루프를 완전히 건너 뛸 수있는 기능을 제공합니다. 즉, 유효성 검사가 필요한 컨트롤이 있으면 자체 등록되며, 그렇지 않으면 페이지의 목록이 비어 있고 아무것도 확인할 필요가 없습니다. 또한 컨트롤을 검색 할 필요가 없기 때문에 컨트롤 이름에 대한 문자열 비교를하지 않아도됩니다. 필요할 때 컨트롤을 등록합니다.

+0

여러 개의 중계기를 통해 aspx 파일에서 생성되므로 컨트롤의 ID를 알 수 없습니다. –

+0

@KevinWasie 아, 그러면 훨씬 더 어려워 질거야.리피터 내부에 사용자 정의 컨트롤이 있습니까? 아니면 단순히 컨트롤을 항목 템플릿 내에 직접 배치합니까? – xxbbcc

+0

항목 템플릿 내 직접적으로 –

0

컨트롤을 재귀 적으로 가져 오려고 했습니까?

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 
+0

아직도 시스템의 배수구가 될 것입니다. @xxbbcc 방법은 트래픽에 대해 확장 가능합니다. 감사. –

관련 문제