日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅析Page.LoadTemplate(模板)方法动态获取绑定模板后,通过FindControl获取服务端控件的方法。...

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析Page.LoadTemplate(模板)方法动态获取绑定模板后,通过FindControl获取服务端控件的方法。... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
平常使用DataList數據控件綁定數據時,都是在ItemTemplate項里面放入 <asp:DataList?ID="list2"?runat="server">
????????????
<ItemTemplate>
????????????????
<asp:HyperLink??ID="hl"?runat="server">
????????????????
</asp:HyperLink>
????????????
</ItemTemplate>
????????
</asp:DataList>之類的服務器控件,然后再通過list_ItemDataBound事件獲取相應的值
void?list2_ItemDataBound(object?sender,?DataListItemEventArgs?e)
????????{
????????????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方法中通過以下的方法

ControlCollection?ctrl?=?e.Item.Controls;

?

找出e.Item中所有的服務器控件,調試ctrl變量

?

?就可以發現controls[1]事實上就是通過e.Item.FindControl能查找到的ID為"hl"的HyperLink控件了。

第2個例子通過Page.LoadTemplate("模板ID")方法來加載臨時的模板,首先建立一個文本文件命名為temp.ascx(改掉文本文件的后綴名)。內容如下

<asp:Label?ID="lbl"?runat="server">
</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事件中定義一個和剛才一樣的控件集合用于跟蹤

ControlCollection?ctrlcollection??=?e.Item.Controls;

?

?調試 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]

Control?ctrl?=?e.Item.Controls[0];

?

?

?

在上面的跟蹤通過ctrl找到ID為lbl的控件也就是說e.item是包含了lbl的父級容器而不是直接包含了lbl本身。問題找到了就好解決。把原來list_ItemDataBound的方法修改為如下:

??void?list_ItemDataBound(object?sender,?DataListItemEventArgs?e)
????????{
????????????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直接找到模板里面的控件的原因了。

?

自己試了下,代碼如下:

?

代碼 public?partial?class?WebForm1?:?System.Web.UI.Page
????{
????????
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();
????????????}
????????}
????}

?

轉載于:https://www.cnblogs.com/jhxk/articles/1801050.html

總結

以上是生活随笔為你收集整理的浅析Page.LoadTemplate(模板)方法动态获取绑定模板后,通过FindControl获取服务端控件的方法。...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。