Compartir a través de


Utilizar la propiedad NamingContainer para determinar el contenedor de nombres de un control

Actualización: noviembre 2007

Puede recorrer el árbol de control de una página mediante la propiedad NamingContainer. A diferencia de la palabra clave Container, que está disponible sólo en código en línea (es decir, en una etiqueta <%# y %>), la propiedad NamingContainer está disponible en código para cualquier instancia de esa clase o de una clase derivada.

El ejemplo de código siguiente muestra cómo recorrer el árbol de control de una página Web de ASP.NET. El controlador de método ChangeBtn_Click del botón busca un control mediante el método FindControl y, a continuación, determina el objeto NamingContainer para ese control. A continuación, determina el contenedor de nomenclatura para el control devuelto por la primera llamada a la propiedad NamingContainer y así en todo el árbol de control hasta que encuentra un control que no tenga contenedor de nomenclatura. (Observe que el método WalkContainers también agregará el tipo del control en el nivel más bajo, que no es en sí un contenedor de nomenclatura.)

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="head1" >
    <title>NamingContainer Example</title>
</head>

<script language="vb" >

    Dim list As ArrayList

    Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

        list = New ArrayList

        list.Add("One")
        list.Add("Two")
        list.Add("Three")
        MyRepeater.DataSource = list
        MyRepeater.DataBind()
    End Sub

    Private Sub ChangeBtn_Click(ByVal sender As Object, ByVal e As EventArgs)

        Dim x As Control = MyRepeater.Items(0).FindControl("Message")

        If Not x Is Nothing Then
            list = WalkContainers(x)
        End If
        MyRepeater.DataSource = list
        MyRepeater.DataBind()
    End Sub

    Private Function WalkContainers(ByVal ctl As Control) As ArrayList

        Dim ret As New ArrayList
        Dim parent As Control = ctl.NamingContainer

        If Not parent Is Nothing Then
            Dim sublist As ArrayList = WalkContainers(parent)
            Dim j As Integer
            For j = 0 To sublist.Count - 1
                ret.Add(sublist(j))
            Next
        End If
        ret.Add(ctl.GetType.Name)
        Return ret
    End Function

</script>
<body>
<form id="repeaterform" >
  <h3>Using the NamingContainer Property to Determine a 
      Control's Naming Container
  </h3>
  <table id="mytable" width="80%">
      <asp:repeater id="MyRepeater" >
      <ItemTemplate>
        <tr>
          <td align="center" style="width:100%;">
           <span id="message" >
           <%#Container.DataItem%>
           </span>
          </td>
        </tr>
      </ItemTemplate>
      </asp:repeater>
    <tr>
      <td align="center" style="width:100%;">
      <input id="changebtn" 
             type="submit" 
             onserverclick="changebtn_click "
              />
       </td>
    </tr>
  </table>
</form>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="head1" >
    <title>NamingContainer Example</title>
</head>

<script language="c#" >

    ArrayList list;

    private void Page_Load(object sender, EventArgs e)
    {
        list = new ArrayList();
        list.Add("One");
        list.Add("Two");
        list.Add("Three");
        MyRepeater.DataSource = list;
        MyRepeater.DataBind();
    }

    private void ChangeBtn_Click(object sender, EventArgs e)
    {
        Control x = MyRepeater.Items[0].FindControl("Message");
        if (x != null) list = WalkContainers(x);
        MyRepeater.DataSource = list;
        MyRepeater.DataBind();
    }

    private ArrayList WalkContainers(Control ctl)
    {
        ArrayList ret = new ArrayList();
        Control parent = ctl.NamingContainer;
        if (parent != null)
        {
            ArrayList sublist = WalkContainers(parent);
            for (int j = 0; j < sublist.Count; j++) ret.Add(sublist[j]);
        }
        ret.Add(ctl.GetType().Name);
        return ret;
    }
</script>


<body>
<form id="repeaterform" >
  <h3>Using the NamingContainer Property to Determine a 
      Control's Naming Container
  </h3>
  <table id="mytable" width="80%">
      <asp:repeater id="MyRepeater" >
      <ItemTemplate>
        <tr>
          <td align="center" style="width:100%;">
           <span id="message" >
           <%#Container.DataItem%>
           </span>
          </td>
        </tr>
      </ItemTemplate>
      </asp:repeater>
    <tr>
      <td align="center" style="width:100%;">
      <input id="changebtn" 
             type="submit" 
             onserverclick="ChangeBtn_Click"
              />
       </td>
    </tr>
  </table>
</form>
</body>
</html>

Vea también

Conceptos

Resolución del identificador de un control de formularios Web Forms