Partager via


Utilisation de la propriété NamingContainer pour déterminer le conteneur de dénomination (naming container) d'un contrôle

Mise à jour : novembre 2007

Vous pouvez remonter l'arborescence de contrôles d'une page au moyen de la propriété NamingContainer. À la différence du mot clé Container, uniquement disponible dans le code incorporé (en d'autres termes, dans une expression <%#   %> déclarative), la propriété NamingContainer est disponible dans le code pour toute instance de cette classe ou d'une classe dérivée.

L'exemple de code suivant montre comment parcourir l'arborescence de contrôles d'une page Web ASP.NET. Le gestionnaire de méthodes ChangeBtn_Click du bouton recherche un contrôle nommé Message dans le premier élément d'un contrôle Repeater à l'aide de la méthode FindControl, puis détermine l'objet NamingContainer de ce contrôle. Il détermine ensuite le conteneur de dénomination du contrôle retourné par le premier appel à la propriété NamingContainer, et ainsi de suite en remontant l'arborescence de contrôles jusqu'à ce qu'il trouve un contrôle qui ne possède aucun conteneur de dénomination. (Notez que la méthode WalkContainers ajoutera également le type du contrôle au niveau le plus bas, qui n'est pas lui-même un conteneur de dénomination.)

<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>

Voir aussi

Concepts

Résolution de l'ID d'un contrôle Web Forms