2013-08-11 2 views
1

아래와 같이 aspx 페이지가 있습니다. 코드 숨김을 사용하여 페이지에서 컨트롤을 찾고 싶습니다.C# - 페이지에서 페이지 컨트롤을 찾으십시오.

protected void Button1_Click(object sender, EventArgs e) 
    { 
     string name; 
     foreach (Control ctrl in Controls) 
     { 
      if (ctrl.Controls.Count > 0) 
      { 
       name = ctrl.GetType().Name; 
      } 
     } 
    } 

뒤에

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title></title> 
    </head> 
<body> 
    <form id="form1" runat="server"> 
     <div> 
     <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 
     </div> 
    </form> 
</body> 
</html> 

코드 나는 루프에있는 버튼을 얻을 수 없습니다. 심지어 내가 얻을 수없는 텍스트 상자를 추가합니다. 어떤 사람이 잘못된 생각을 갖고 있습니까? 도와주세요.

+0

컨트롤에 컨트롤이있는 경우 이름을 설정하려고한다는 메시지가 표시됩니다. 나는 그것이 당신이 찾고있는 것이 아니라고 생각하고 있습니다 ... (ctrl.Controls.Count> 0) –

답변

1

페이지에 모든 컨트롤이 표시되지 않기 때문입니다. 재귀 적으로 컨트롤을 가져와야합니다. 다음과 같이

public static class ControlExtensions 
{ 
    public static List<Control> GetChildrenRecursive(this Control control) 
    { 
     var result = new List<Control>(); 
     foreach (Control childControl in control.Controls) 
     { 
      result.Add(childControl); 
      if (childControl.Controls.Count > 0) 
      { 
       result.AddRange(GetChildrenRecursive(childControl)); 
      } 
     } 

     return result; 
    } 
} 

지금 당신은 당신의 코드를 다시 작성할 수 있습니다 :

foreach (Control ctrl in this.Page.GetChildrenRecursive()) 
{ 
    // Your button element is accessible now. 
} 
1

이 시도 여기에 확장 메서드입니다.

protected void Button1_Click(object sender, EventArgs e) 
{ 
    string Name = ""; 
    string Type = ""; 
    string Id = ""; 
    foreach (Control ctr in form1.Controls) 
    { 
     Name = ctr.GetType().Name; 
     Type = ctr.GetType().ToString(); ; 
     Id = ctr.ID; // If its server control 
    } 
} 
1

ASP.Net은 페이지를 계층 적으로 렌더링합니다. 즉 최상위 수준 컨트롤 만 직접 렌더링됩니다. 이러한 최상위 수준 컨트롤에 자식 컨트롤이 포함되어있는 경우 이러한 최상위 컨트롤은 자체 Controls 속성을 제공합니다.

예를 들어, 양식은 Button과 같은 하위 컨트롤이 포함 된 최상위 컨트롤입니다. 그래서 버튼을 클릭하여 재귀 적으로 메소드를 호출하십시오.

protected void Button1_Click(object sender, EventArgs e) 
    { 
     DisplayControl(Page.Controls); 

    } 

    private void DisplayControls(ControlCollection controls) 
    { 

     foreach (Control ctrl in controls) 
     { 
      Response.Write(ctrl.GetType().ToString() + " , ID::" + ctrl.ID + "<br />"); 

      // check for child OR better to say nested controls 
      if (ctrl.Controls != null) 
       DisplayControls(ctrl.Controls); 
     } 

    } 
관련 문제