Поделиться через


Использование свойства NamingContainer для определения контейнера именования элемента управления

Обновлен: Ноябрь 2007

Можно пройти по дереву элемента управления на странице с помощью свойства NamingContainer. В отличие от ключевого слова Container, которое доступно только во встроенном коде (т. е. в декларативном выражении <%#   %>), свойство NamingContainer доступно в коде для любого экземпляра этого класса или производного класса.

Следующий пример кода показывает, как пройти по дереву элемента управления веб-страницы ASP.NET. Обработчик метода ChangeBtn_Click кнопки ищет элемент управления с именем Message в первом элементе элемента управления Repeater, используя метод FindControl, а затем определяет объект NamingContainer для данного элемента управления. Затем определяется контейнер именования для элемента управления, возвращаемый первым вызовом свойства NamingContainer, и т. д. вверх по дереву элементов управления, пока не будет обнаружен элемент управления, не имеющий контейнера. (Обратите внимание, что метод WalkContainers также добавит тип элемента управления на самом низком уровне, который сам по себе не является контейнером.)

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

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

<script language="vb" runat="server">

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

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

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

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

См. также

Основные понятия

Разрешение идентификации элементов управления Web Form