Partager via


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

Mise à jour : novembre 2007

Lorsque vous déclarez un attribut ID sur un contrôle serveur Web pour fournir l'accès par programme à ce contrôle, l'infrastructure de page ASP.NET garantit automatiquement que l'ID déclaré sera unique dans toute votre application Web ASP.NET.

Le conteneur de dénomination (naming container)

L'infrastructure de page ASP.NET offre aux applications une résolution d'ID automatique via l'interface INamingContainer, qui génère un conteneur de dénomination pour chaque classe qui l'implémente. Un conteneur de dénomination définit un nouvel espace de noms ID dans la hiérarchie des contrôles d'une page Web ASP.NET. Il permet ensuite à l'infrastructure de page de générer une valeur pour la propriété UniqueID de chaque objet Control généré dans cet espace de noms. La propriété UniqueID est différente de la propriété ID que vous déclarez dans la mesure où elle représente l'identificateur complet d'un contrôle.

Les classes qui implémentent INamingContainer incluent : Page, DataList, GridView, DataListItem, DataGridItem et Repeater. En général, les contrôles qui peuvent créer des contrôles enfants dynamiquement implémentent INamingContainer.

La classe Page sert de conteneur de dénomination de niveau supérieur pour la hiérarchie des contrôles de cette page.

Résolution de noms dans les scénarios de liaison de données

La résolution de noms automatique fournie par l'infrastructure de page prend toute son importance dans les scénarios de liaison de données. Prenons l'exemple suivant qui affiche des contrôles déclarés sur une page.

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

Lorsque le contrôle Label est lié à une source de données et que le contrôle Repeater parcourt les éléments de cette source de données, la page doit être en mesure de différencier par programme les diverses instances du contrôle Label, bien que vous ayez uniquement assigné l'ID MyLabel à chaque instance. Pour ce faire, l'infrastructure de page utilise la propriété UniqueID complète de chaque contrôle. Par exemple, le code suivant génère trois versions du contrôle Label et écrit leurs valeurs de propriété UniqueID dans la page.

  <script language="vb" >

      Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
          Dim sb As New StringBuilder()
          sb.Append("Container: " + _
          MyDataList.NamingContainer.ToString() + "<p>")

          Dim a As New ArrayList()
          a.Add("A")
          a.Add("B")
          a.Add("C")

          MyDataList.DataSource = a
          MyDataList.DataBind()

          Dim i As Integer
          Dim l As Label
          For i = 0 To MyDataList.Controls.Count - 1
              l = CType(CType(MyDataList.Controls(i), RepeaterItem).FindControl("MyLabel"), Label)
              sb.Append("Container: " & _
                 CType(MyDataList.Controls(i), RepeaterItem).NamingContainer.ToString() & _
                 "<p>")
              sb.Append("<b>" & l.UniqueID.ToString() & "</b><p>")
          Next
          ResultsLabel.Text = sb.ToString()
      End Sub
</script>
<script language="c#" >

  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>

Lors d'une demande de la page, il y écrit ce qui suit :

  • Conteneur de dénomination du contrôle Repeater nommé MyDataList. Ce conteneur de dénomination dépend du nom donné au fichier .aspx.

    Remarque :

    Si le fichier .aspx de cet exemple était MySample1.aspx, la classe du conteneur de dénomination s'appellerait ASP.mysample1_aspx mais le conteneur de dénomination serait Page.

  • Instance du contrôle suivant qui sert de conteneur de dénomination, à savoir le contrôle Repeater. Ce nom de conteneur est affiché avec son qualificateur d'espace de noms entier.

  • Propriété UniqueID de chaque contrôle Label à l'intérieur du contrôle Repeater.

    Remarque :

    N'écrivez pas de code référençant des contrôles à l'aide de la valeur de la propriété UniqueID générée. Vous pouvez traiter la propriété UniqueID comme un handle (par exemple, en la passant à un processus), mais vous ne devez pas compter sur le fait qu'elle possède une structure spécifique.

Voir aussi

Tâches

Comment : rechercher des contrôles enfants par ID dans une page Web ASP.NET

Comment : accéder aux membres du conteneur de dénomination (naming container) d'un contrôle serveur Web

Concepts

Vue d'ensemble des contrôles serveur Web ASP.NET

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