본문 바로가기

.NET/ASP.NET

Web Forms 컨트롤 ID 확인

반응형

Web Forms 컨트롤 ID 확인

업데이트: 2007년 11월

웹 서버 컨트롤에 프로그래밍 방식으로 액세스할 수 있도록 해당 컨트롤에 대해 ID 특성을 선언하는 경우 ASP.NET 페이지 프레임워크에서는 사용자가 선언하는 ID가 전체 ASP.NET 웹 응용 프로그램에서 고유한 상태가 되도록 자동으로 확인합니다.

ASP.NET 페이지 프레임워크에서는 INamingContainer 인터페이스를 통해 응용 프로그램에 자동 컨트롤 ID 확인 기능을 제공합니다. 이 인터페이스는 자신을 구현하는 각 클래스에 대해 명명 컨테이너를 생성합니다. 명명 컨테이너는 ASP.NET 웹 페이지 컨트롤 계층 내에 새 ID 네임스페이스를 정의합니다. 그런 다음 페이지 프레임워크에서는 이 네임스페이스에서 생성된 각 Control 개체의 UniqueID 속성에 대한 값을 생성할 수 있습니다. UniqueID 속성은 컨트롤의 정규화된 식별자라는 점에서 사용자가 선언하는 ID 속성과 다릅니다.

INamingContainer를 구현하는 클래스에는 PageDataListGridViewDataListItemDataGridItem 및Repeater 등이 있습니다. 일반적으로 자식 컨트롤을 동적으로 만들 수 있는 컨트롤은 INamingContainer를 구현합니다.

Page 클래스는 해당 페이지의 컨트롤 계층에 대한 최상위 명명 컨테이너로 사용됩니다.

페이지 프레임워크에서 제공하는 자동 이름 확인 기능은 데이터 바인딩 시나리오에서 중요합니다. 페이지에 선언된 컨트롤을 보여 주는 다음 예제를 참조하십시오.

C#
<asp:Repeater id="MyDataList" runat="server">
  <ItemTemplate>
    <asp:Label id="MyLabel" Text="<%# Container.ToString() %>" runat="server"/><br />
  </ItemTemplate>
</asp:Repeater>
<hr />
<asp:Label id="ResultsLabel" runat="server" AssociatedControlID="MyDataList"/>

Label 컨트롤이 데이터 소스에 바인딩되어 있고 Repeater 컨트롤이 이 데이터 소스의 항목을 반복할 경우에는 각 인스턴스의 ID를 모두 MyLabel로 할당했더라도 페이지에서 Label 컨트롤의 여러 인스턴스를 프로그래밍 방식으로 구별할 수 있어야 합니다. 페이지 프레임워크에서는 각 컨트롤의 정규화된 UniqueID 속성을 사용하여 이를 수행합니다. 예를 들어 다음 코드에서는 세 가지 버전의 Label 컨트롤을 생성하고 UniqueID 속성 값을 페이지에 작성합니다.

C#
<script language="c#" runat="server">

  void Page_Load(Object sender, EventArgs e) 
  {
      StringBuilder sb = new StringBuilder();
      sb.Append("Container: " + 
          MyDataList.NamingContainer.ToString() + "<p>");

      ArrayList a = new ArrayList();
      a.Add("A");
      a.Add("B");
      a.Add("C");

      MyDataList.DataSource = a;
      MyDataList.DataBind();

      for (int i = 0; i < MyDataList.Controls.Count; i++)
      {
          Label l = 
              (Label)((RepeaterItem)MyDataList.Controls[i]).FindControl("MyLabel");
          sb.Append("Container: " + 
              ((RepeaterItem)MyDataList.Controls[i]).NamingContainer.ToString() + 
              "<p>");
          sb.Append("<b>" + l.UniqueID + "</b><p>");
      }
      ResultsLabel.Text = sb.ToString();
}
</script>