????????????<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直接找到模板里面的控件的原因了。
?
自己試了下,代碼如下:
?


????{
????????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();
????????????}
????????}
????}
?