Verwenden der NamingContainer-Eigenschaft, um den Namenscontainer eines Steuerelements zu bestimmen
Aktualisiert: November 2007
Sie können mit der NamingContainer-Eigenschaft die Steuerelementstruktur auf einer Seite durchlaufen. Im Gegensatz zum Container-Schlüsselwort, das nur als Inlinecode verfügbar ist (also als deklarativer <%# %>-Ausdruck), steht die NamingContainer-Eigenschaft jeder Instanz dieser oder einer abgeleiteten Klasse im Code zur Verfügung.
Im folgenden Codebeispiel wird veranschaulicht, wie die Steuerelementstruktur einer ASP.NET-Webseite durchlaufen wird. Der ChangeBtn_Click-Methodenhandler der Schaltfläche sucht mithilfe der FindControl-Methode im ersten Element eines Repeater-Steuerelements nach einem Steuerelement mit der Bezeichnung Message und legt dann für dieses Steuerelement das NamingContainer-Objekt fest. Anschließend bestimmt der Handler den Namenscontainer für das Steuerelement, das beim ersten Aufruf der NamingContainer-Eigenschaft zurückgegeben wird, und so wird die Steuerelementstruktur weiter aufwärts durchlaufen, bis ein Steuerelement ohne Namenscontainer gefunden wird. (Beachten Sie, dass die WalkContainers-Methode auch den Typ des Steuerelements auf der untersten Ebene hinzufügt, das selbst kein Namenscontainer ist.)
<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>