< ItemTemplate >
< asp:HyperLink ID ="hl" runat ="server" >
</ asp:HyperLink >
</ ItemTemplate >
</ asp:DataList >
{
HyperLink hl = (HyperLink)e.Item.FindControl( " hl " );
hl.Text = DataBinder.Eval(e.Item.DataItem, " name " ).ToString();
hl.NavigateUrl = " ./default.aspx " ;
}
但是DataList的ItemTemplate有些时候是不固定的,需要从Page.LoadTemplate("模板的路径")方法里面加载。这样的话通过e.Item.FindControl("服务器控件ID")就无法找到相应的服务器控件。为什么呢?
通过分析e.Item入手,可以做两个不同的绑定然后进行跟踪对比,首先按照常规的绑定办法在跟踪list2_ItemDataBound事件中的e.Item 。在list2_ItemDataBound方法中通过以下的方法
找出e.Item中所有的服务器控件,调试ctrl变量
就可以发现controls[1]事实上就是通过e.Item.FindControl能查找到的ID为"hl"的HyperLink控件了。
第2个例子通过Page.LoadTemplate("模板ID")方法来加载临时的模板,首先建立一个文本文件命名为temp.ascx(改掉文本文件的后缀名)。内容如下
</ asp:Label >
然后在后台定义一个DataList并指明触发绑定的相关事件
DataList list = new DataList();
list.ItemTemplate = Page.LoadTemplate( " temp.ascx " );
list.ItemDataBound += new DataListItemEventHandler(list_ItemDataBound);
list.DataSource = dt;
list.DataBind();
在list_ItemDataBound事件中定义一个和刚才一样的控件集合用于跟踪
调试 ctrlcollection
很显然通过e.Item.FindControl显然找不到想要之前在模板定义ID为"lbl"的Label控件。而是找到他的父级的容器即之前定义的模板temp.ascx。而且ctrlcollection.Count=1.也就说明了e.Item下面包含的子容器也就只有temp.ascx。
也就是说可以通过查找e.Item.Controls[0]找到lbl了。尝试跟踪一下e.Item.Controls[0]
在上面的跟踪通过ctrl找到ID为lbl的控件也就是说e.item是包含了lbl的父级容器而不是直接包含了lbl本身。问题找到了就好解决。把原来list_ItemDataBound的方法修改为如下:
{
Control ctrl = e.Item.Controls[ 0 ];
Label lbl = (Label)ctrl.FindControl( " lbl " );
lbl.Text = DataBinder.Eval(e.Item.DataItem, " name " ).ToString();
}
总结:通过Page.LoadTemplate("...")方法加载临时的模板和在页面中直接使用还是有所不同的,直接使用的模板e.Item就是控件的父级容器,而加载模板的方式e.Item只是模板的父级容器,也就是说e.Item应该属于模板里面控件的父级的容器,这也就是为什么在加载模板的情况下不能通过e.Item.FindControl直接找到模板里面的控件的原因了。
自己试了下,代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
protected void Page_Load( object sender, EventArgs e)
{
DlBinds();
}
private void DlBinds()
{
DataList list = new DataList();
DataTable dt = new DataTable();
list.HeaderTemplate = Page.LoadTemplate( " HeadTemp.ascx " );
list.ItemTemplate = Page.LoadTemplate( " Temp.ascx " );
dt.Columns.Add( " name " , typeof (String));
dt.Rows.Add( new Object[] { " 张三 " });
dt.Rows.Add( new Object[] { " 李四 " });
list.ItemDataBound += new DataListItemEventHandler(DataList1_ItemDataBound);
list.DataSource = dt;
list.DataBind();
Page.Controls.Add(list);
}
protected void DataList1_ItemDataBound( object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Control ctrl = e.Item.Controls[ 0 ];
Label lbl = ctrl.FindControl( " lbl " ) as Label;
lbl.Text = DataBinder.Eval(e.Item.DataItem, " name " ).ToString();
}
}
}