我们在用GridView控件时经常要在里面嵌套其它控件,嵌套层次多了以后需要通过NamingContainer来查找控件,那么NamingContainer到底是什么意思呢,通过资料做了个小例子,并且用它与UniqueID作对比。
文献资料:
Control.NamingContainer 属性获取对服务器控件的命名容器的引用,此引用创建唯一的命名空间,以区分具有相同 Control.ID 属性值的服务器控件。
ASP.NET Web 应用程序的每一页均包含控件的层次结构。此层次结构与控件是否生成用户可见的 UI 无关。给定控件的命名容器是层次结构中该控件之上的父控件,此父控件实现 INamingContainer 接口。实现此接口的服务器控件为其子服务器控件的 ID 属性值创建唯一的命名空间。
当针对列表 Web 服务器控件(如 Repeater 和 DataList 服务器控件)进行数据绑定时,为服务器控件创建唯一的命名空间尤其重要。当数据源中的多个项创建服务器控件的多个实例,且该服务器控件是重复控件的子级时,命名容器确保这些子控件的每个实例具有不冲突的 UniqueID 属性值。页的默认命名容器是请求该页时生成的 Page 类的实例。
可以使用此属性确定特定服务器控件所在的命名容器。
看文字晕,结全代码看看就明白了。
<% @ Import Namespace = "System.Data" %>
<html>
<head>
<script language="C#" runat="server">
//创建数据源
ICollection CreateDataSource()
{
DataTable myDataTable = new DataTable();
DataRow myDataRow;
myDataTable.Columns.Add(new DataColumn("EmployeeName", typeof(string)));//增加第一列
myDataTable.Columns.Add(new DataColumn("WebUrl", typeof(string)));//增加第二列
for (int i = 0; i < 10; i++)
{
myDataRow = myDataTable.NewRow();
myDataRow[0] = "somename" + i.ToString();
myDataRow[1] = "
http://www.cn-web.com/" + i.ToString();
myDataTable.Rows.Add(myDataRow);
}
DataView myDataView = new DataView(myDataTable);
return myDataView;
}
void Page_Load(Object sender, EventArgs e)
{
if (!IsPostBack)
{
// 绑定数据源
GridView1.DataSource = CreateDataSource();
GridView1.DataBind();
}
}
void button1_Click(Object sender,EventArgs e)
{
LinkButton myLB = (LinkButton)sender;//获取事件发送者LinkButton1
Control myNamingContainer = myLB.NamingContainer;//获取LinkButton1的NamingContainer
myLabel1.Text = "The NamingContainer is : " + myNamingContainer.UniqueID;
// Display the UniqueID.
myLabel2.Text = "The UniqueID is : " + myLB.UniqueID;//获取LinkButton1的UniqueID
myLabel3.Text="button2的ID为"+myLB.FindControl("button2").UniqueID;//获取LinkButton2的UniqueID
}
void button2_Click(Object sender,EventArgs e)
{
LinkButton myLB = (LinkButton)sender;//获取事件发送者LinkButton2
Control myNamingContainer = myLB.NamingContainer;//获取LinkButton1的NamingContainer
myLabel1.Text = "The NamingContainer is : " + myNamingContainer.UniqueID;
// Display the UniqueID.
myLabel2.Text = "The UniqueID is : " + myLB.UniqueID;//获取LinkButton1的UniqueID
myLabel3.Text="button1的ID为"+myLB.FindControl("button1").UniqueID;//获取LinkButton2的UniqueID
}
</script>
</head>
<body>
<form runat="server" ID="Form1">
<h3>
Control NamingContainer Example
</h3>
<h4>
Click an item to view it's Naming Container and UniqueID
</h4>
<asp:Label ID="myLabel1" Runat="server"></asp:Label>
<br>
<asp:Label ID="myLabel2" Runat="server"></asp:Label> <br>
<asp:Label ID="myLabel3" Runat="server"></asp:Label>
<br>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="EmployeeName">
<ItemTemplate>
<asp:LinkButton id="button1" Text='<%# DataBinder.Eval(Container.DataItem, "EmployeeName") %>' runat="server" OnClick="button1_Click" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="WebUrl">
<ItemTemplate>
<asp:LinkButton id="button2" Text='<%# DataBinder.Eval(Container.DataItem, "WebUrl") %>' runat="server" OnClick="button2_Click" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</form>
</body>
</html>
以上代码充分说明,在GridView 控件中,我们只要得到GridView 里一个控件,然后通过它的NamingContainer属性获取此控件的命名容器(NamingContainer),然后通过FindControl方法就可以找到同属于该NamingContainer下的其它控件了。
效果图示: