使用 NamingContainer 屬性決定控制項的命名容器

更新:2007 年 11 月

您可以藉由 NamingContainer 屬性逐步查核網頁上的控制項樹狀結構。與 Container 關鍵字 (只能用於內嵌程式碼,也就是在宣告式 <%#   %> 運算式中) 相比,在程式碼中類別或衍生類別的任何執行個體 (Instance) 都可以使用 NamingContainer 屬性。

下列程式碼範例說明如何查核 ASP.NET Web 網頁的控制項樹狀結構。按鈕的 ChangeBtn_Click 方法處理常式會使用 FindControl 方法,在 Repeater 控制項的第一個項目中搜尋名為 Message 的控制項,然後判斷該控制項的 NamingContainer 物件。然後再判斷首次呼叫 NamingContainer 屬性所傳回控制項的命名容器,並且繼續在控制項樹狀結構中執行這個動作,直到找到沒有命名容器的控制項為止 (請注意,WalkContainers 方法也會在最底層加入控制項型別,其本身不是命名容器)。

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

請參閱

概念

Web Form 控制項 ID 解析