Utilizzo della proprietà NamingContainer per stabilire il contenitore di denominazione di un controllo

Aggiornamento: novembre 2007

È possibile scorrere la struttura di controlli su una pagina utilizzando la proprietà NamingContainer. A differenza della parola chiave Container, disponibile solo nel codice inline (ovvero in un'espressione dichiarativa <%#   %>), la proprietà NamingContainer è disponibile nel codice per qualsiasi istanza della classe in oggetto o di una classe derivata.

Nell'esempio di codice riportato di seguito viene illustrato come scorrere la struttura di controlli di una pagina Web ASP.NET. Il gestore metodi ChangeBtn_Click del pulsante esegue la ricerca di un controllo denominato Message nel primo elemento di un controllo Repeater mediante il metodo FindControl e quindi determina l'oggetto NamingContainer per tale controllo. Determina anche il contenitore di denominazione per il controllo restituito dalla prima chiamata alla proprietà NamingContainer procedendo nella struttura di controlli fino a individuare un controllo per il quale non sia presente un contenitore di denominazione. Il metodo WalkContainers aggiunge, inoltre, il tipo di controllo al livello inferiore che non rappresenta un contenitore di denominazione.

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

Vedere anche

Concetti

Risoluzione degli ID dei controlli Web Form