淺析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直接找到模板里面的控件的原因了。

?

自己試了下,代碼如下:

?

ExpandedBlockStart.gif代碼
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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275933.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蘋果5s變磚_蘋果磚的故事以及可以改進的地方

蘋果5s變磚Even since I can remember I’ve always been curious about trying out all kinds of software, checking out different operating systems, and improving my own user experience through customizing them. Over the years I’ve had the opportunity to test …

學習 launch-editor 源碼整體架構,探究 vue-devtools「在編輯器中打開組件」功能實現原理...

1. 前言你好&#xff0c;我是若川[1]&#xff0c;微信搜索「若川視野」關注我&#xff0c;專注前端技術分享&#xff0c;一個愿景是幫助5年內前端開闊視野走向前列的公眾號。歡迎加我微信ruochuan12&#xff0c;長期交流學習。這是學習源碼整體架構系列 之 launch-editor 源碼&…

:傳遞給 left 或 substring 函數的長度參數無效。_Java函數式編碼結構-好程序員

好程序員Java培訓分享Java函數式編碼結構&#xff0c;本文將探討三種下一代JVM語言&#xff1a;Groovy、Scala和Clojure&#xff0c;比較并對比新的功能和范例&#xff0c;讓Java開發人員對自己近期的未來發展有大體的認識&#xff0c;下面我們一起來看一下吧。當垃圾回收成為主…

系統架構師學習筆記_第十一章(上)_連載

第十一章 信息安全技術 11.1 信息安全關鍵技術 11.1.1 加密和解密 有意的計算機犯罪 和 無意的數據破壞 被動攻擊&#xff1a;非法地從傳輸信道上截取信息&#xff0c;或從存儲載體上 偷竊、復制 信息。 主動攻擊&#xff1a;對傳輸或存儲的數據進行 惡意的刪除、篡改 等。 …

跨庫一致性_設計跨平臺的一致性

跨庫一致性I offended an Apple employee the other day when I was checking out the new iPad Pro and I told him that I was an Android phone user. Eyes rolled, jokes were made, and we agreed to disagree.前幾天&#xff0c;我在檢閱新iPad Pro時冒犯了一名蘋果員工&…

React-生命周期雜記

前言 自從React發布Fiber之后&#xff0c;更新速度日新月異&#xff0c;而生命周期也隨之改變&#xff0c;雖然原有的一些生命周期函數面臨廢棄&#xff0c;但理解其背后更新的機制也是一種學習 在這里根據官方文檔以及社區上其他優秀的文章進行一個對于生命周期的總結&#xf…

漫畫 | 一個NB互聯網項目的上線過程…

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天雖然是周六&#xff0c;但還是要上班&#xff0c;所以就推薦一篇比較輕松的漫畫。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體…

stm32 中斷處理級別_STM32中斷優先級徹底講解

文章來源&#xff1a;http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html一&#xff1a;綜述STM32 目前支持的中斷共為 84 個(16 個內核68 個外部)&#xff0c; 16 級可編程中斷優先級的設置(僅使用中斷優先級設置 8bit 中的高 4 位)和16個搶占優先級(因為搶占優先級最多可…

胖子臉:庫珀·布萊克100年

In 16th century Europe, roman typefaces were the first to surpass blackletter as the preferred choice for expressing emphasis in print. True bold weight roman letters didn’t appear until the 19th century, which critics quickly coined “Fat Faces” due to …

C語言中的布爾值

C語言的布爾類型在C語言標準(C89)沒有定義布爾類型&#xff0c;所以C語言判斷真假時以0為假&#xff0c;非0為真。所以我們通常使用邏輯變量的做法&#xff1a; //定義一個int類型變量&#xff0c;當變量值為0時表示false&#xff0c;值為1時表示trueint flag;flag 0;//......…

用委托實現窗體間傳值

1.新建一個工程.在Form1中添加一個Label和一個Button.新建一個事件類,讓它有一個string 類型的屬性,用于傳值. 1 ///ReturnValueEventArgs.cs 2 using System; 3 using System.Collections.Generic; 4 using System.Text; 5 6 namespace test 7 { 8 public class Return…

c++ explicit關鍵字_聊一聊 C++的特性 explicit 匿名空間

聊一聊 C的特性 explicit && 匿名空間explicit關鍵字首先看一下explicit的作用&#xff1a;explicit 是避免構造函數的參數自動轉換為類對象的標識符&#xff0c;平時代碼中并不是經常用到&#xff0c;但是&#xff0c;有時候就是因為這個&#xff0c;會造成一定的BUG出…

谷歌瀏覽器那些有趣的隱藏功能

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天推薦一篇實用文章。文末有抽獎。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列很多小伙伴說還是…

AppDelegate的模塊化+瘦身

前言 關于iOS的模塊化&#xff0c;要追溯到16年接觸的BeeHive了&#xff0c;BeeHive將功能模塊化&#xff0c;以module的形式進行構建&#xff0c;以performSelector&#xff1a;的形式進行module的事件響應&#xff0c;以protocol的形式進行module間的通信。可以說思路非常清晰…

yii mysql_Yii2框架操作數據庫的方法分析【以mysql為例】

本文實例講述了Yii2框架操作數據庫的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;準備數據庫DROP TABLE IF EXISTS pre_user;CREATE TABLE pre_user(id int(11) AUTO_INCREMENT PRIMARY KEY,username varchar(255) NOT NULL,password varchar(32) NOT NULL DEF…

C++接口注意

1. 用Record接口&#xff0c;要注意 Packed的區別 2. cdecl和stdcall的區別 3. C導出的函數建議用C格式stdcall導出&#xff0c;使用Def文件定義名稱 4. 用VS寫的API dll要注意是否引用了MFC的DLL&#xff0c;否則會使LoadLibrary失敗&#xff0c;并GetLastError后返回14001 Ap…

Vue 3.1.0 的 beta 版發布

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。昨晚尤大視頻號直播說到vue 3.1.0 beta版發布了&#xff0c;今天分享這篇文章。也有小伙伴可能注意到了昨晚我一直在送禮物。點擊下方卡片關注我、加個星標&#xff0c…

設計模式練習_設計練習是邪惡的

設計模式練習It was the final round of interviews. Or, so the candidate thought.這是采訪的最后一輪。 或者&#xff0c;所以候選人認為。 She’d spent all day interviewing in our office. As the final interviewer, I walked her out the building. She seemed confi…

morningcat2018 LearningDocs

2019獨角獸企業重金招聘Python工程師標準>>> LearningDocs 學習資料與文檔 JCP&#xff08;Java Community Process &#xff0c;Java社區進程 &#xff09; https://www.jcp.org/en/home/index JSR&#xff08;Java Specification Requests&#xff0c;Java規范請求…

firefox下可惡的value

前幾天做項目 遇到這樣一個情況 document.getElementById("txtTest").value "111"; 這條語句在ff下和ie下都是好用的 但是用開發工具看html代碼 ie下顯示正常 ff下顯示的卻是修改之前的(實際上已經修改了&#xff0c;只是html沒有修改過來) 用js修改input…