国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ASP.NET復合控件引發數據綁定事件

開發 后端
本文介紹如何使用ASP.NET復合控件引發數據綁定事件。

生成數據綁定ASP.NET復合控件

大多數復雜的服務器控件都已綁定數據(也可能已經模板化),并且由各種子控件構成。這些控件保留了一個構成項(通常為表的行或單元格)的列表。該列表在經過回發后會保存在視圖狀態中,并且從綁定數據生成或從視圖狀態重建。該控件還在視圖狀態中保存其構成項的數量,以便在頁面中其他控件引起回發時可以正確重建表結構。我將用 DataGrid 控件舉例說明。

DataGrid 由一列行構成,每一行都代表綁定數據源中的一個記錄。每個網格行都通過一個 DataGridRow 對象(從 TableRow 派生的一個類)表示。在各網格行創建完成并被添加到最終網格表時,諸如 ItemCreated 和 ItemDataBound 之類的相應事件將被引發至頁面。當通過數據綁定創建 DataGrid 時,其行數由綁定項數和頁面大小決定。如果帶有 DataGrid 的頁面回發會怎樣?

這種情況下,如果是由 DataGrid 自身引起的回發(例如,用戶單擊以進行排序或標頁),則新頁面會再次通過數據綁定來呈現 DataGrid。這是顯而易見的,因為 DataGrid 需要刷新數據進行顯示。如果是主頁回發,則情況就不同了,因為單擊了頁面上的另一個控件(例如某按鈕)。這種情況下,DataGrid 不綁定到數據并且必須從視圖狀態進行重建。(如果禁用了視圖狀態,就是另外一種情況了,這時只能通過數據綁定顯示網格。)

數據源不保存在視圖狀態中。作為復合控件,DataGrid 包含子控件,其中每個子控件都將自己的狀態保存到視圖狀態并從視圖狀態恢復。DataGrid 只需跟蹤在所有行和所包含控件從視圖狀態恢復之前它所必須重復執行的次數。此次數與所顯示綁定項的數量一致,并且必須作為控件狀態的一部分存儲到視圖狀態中。在 ASP.NET 1.x 中,您必須自己學習并實現此模式。在 ASP.NET 2.0 中,從新類 CompositeDataBoundControl 派生您的復合控件就可以了。

讓我們嘗試使用一種顯示可擴展數據綁定新聞標題行的網格類控件。在此過程中,我們將再度使用在前文中論及的 Headline 控件。

  1. public class HeadlineListEx :CompositeDataBoundControl  
  2. {  
  3.   :  
  4. }  

HeadlineListEx 控件包含了一個收集了所有綁定數據項的 Items 集合屬性。該集合為公共集合,并且可在與多數列表控件一起運行時通過編程方式填充。對典型數據綁定的支持是通過一對屬性(DataTextField 和 DataTitleField)實現的。這兩個屬性表明了數據源中將用于填充新聞標題和文本的字段。Items 集合被保存到視圖狀態中。

要將 HeadlineListEx 控件轉換為真正的ASP.NET復合控件,您首先需要從 CompositeDataBoundControl 將其派生出來,然后再替換 CreateChildControls。有意思的是,你會注意到 CreateChildControls 是重載方法。

  1. override int CreateChildControls()  
  2. override int CreateChildControls(IEnumerable data, bool dataBinding)  

***個重載方法替換了在 Control 類中定義的方法。第二個重載方法是每個復合控件都必須替換的一種抽象方法。實際上,復合控件的開發工作簡化為兩大主要任務:

替換 CreateChildControls。

實現 Rows 集合屬性以跟蹤控件的所有構成項。

Rows 屬性不同于 Items,因為它不保存在視圖狀態中,且具有與請求相同的生存期,并引用幫助程序對象而不是綁定數據項。

  1. public virtual HeadlineRowCollection Rows  
  2. {  
  3. get 
  4.     {  
  5. if (_rows == null)  
  6. _rows = new HeadlineRowCollection();  
  7. return _rows;  
  8.      }  
  9. }  

Rows 集合在控件生成時填充。讓我們看一下 CreateChildControls 的替換方法。該方法采用了兩個參數:綁定項和一個布爾標記,其中布爾標記用于指明該控件是通過數據綁定創建還是通過視圖狀態創建。(請注意示例程序文件中的程序員注釋使用的是英文,本文中將其譯為中文是為了便于參考。)

  1. override int CreateChildControls(IEnumerable dataSource, bool dataBinding)  
  2. {  
  3. if (dataBinding)  
  4.    {  
  5. string textField = DataTextField;  
  6. string titleField = DataTitleField;  
  7. if (dataSource != null)  
  8.       {  
  9. foreach (object o in dataSource)  
  10.          {  
  11. HeadlineItem elem = new HeadlineItem();  
  12. elem.Text = DataBinder.GetPropertyValue(o, textField, null);  
  13. elem.Title = DataBinder.GetPropertyValue(o, titleField, null);  
  14. Items.Add(elem);  
  15.          }  
  16.       }  
  17.    }   
  18.  
  19. // 開始生成控件層次結構  
  20. Table t = new Table();  
  21. Controls.Add(t);  
  22. Rows.Clear();  
  23. int itemCount = 0;  
  24.  
  25. foreach(HeadlineItem item in Items)  
  26.    {  
  27. HeadlineRowType type = HeadlineRowType.Simple;  
  28. HeadlineRow row = CreateHeadlineRow(t, type,   
  29. item, itemCount, dataBinding);  
  30. _rows.Add(row);  
  31. itemCount++;  
  32.     }  
  33.  
  34. return itemCount;  
  35. }  
  36.  

在數據綁定的情況下,首先要填充 Items 集合。遍歷綁定集合,提取數據,然后填充 HeadlineItem 類的新建實例。接下來,遍歷 Items 集合(該集合中可能包含以編程方式添加的附加項),并在控件中創建行。

  1. HeadlineRow CreateHeadlineRow(Table t, HeadlineRowType rowType,   
  2. HeadlineItem dataItem, int index, bool dataBinding)  
  3. {  
  4. // 為最外部表創建新行  
  5. HeadlineRow row = new HeadlineRow(rowType);  
  6.  
  7. // 為子控件創建單元格  
  8. TableCell cell = new TableCell();  
  9. row.Cells.Add(cell);  
  10. Headline item = new Headline();  
  11. cell.Controls.Add(item);  
  12.  
  13. // 此時引發 HeadlineRowCreated 事件  
  14.  
  15. // 將此行添加到所創建的 HTML 表  
  16. t.Rows.Add(row);  
  17.  
  18. // 處理數據對象綁定  
  19. if (dataBinding)  
  20.    {  
  21. row.DataItem = dataItem;  
  22. Headline ctl = (Headline) cell.Controls[0];  
  23. ctl.Text = dataItem.Text;  
  24. ctl.Title = dataItem.Title;  
  25.                   
  26. // 此時引發 HeadlineRowDataBound 事件  
  27.     }  
  28. return row;  
  29. }  
  30.  

CreateHeadlineRow 方法會創建并返回 HeadlineRow 類(從 TableRow 派生而來)的一個實例。在這種情況下,此行會包含一個由 Headline 控件填充的單元格。在其他情況下,您可以更改此部分代碼以根據需要添加多個單元格并相應填充內容。

重要的是,要將所需完成的任務分為兩個不同的步驟:創建和數據綁定。首先,創建行的布局,引發行創建事件(如果有),并***將其添加到父表中。接下來,如果要將控件綁定到數據,則設置對綁定數據敏感的子控件屬性。完成操作后,則引發一個行數據綁定事件(如果有)。

請注意,該模式更準確描述了ASP.NET復合控件的內部體系結構。

可以使用以下代碼來引發事件。

  1. HeadlineRowEventArgs e = new HeadlineRowEventArgs();  
  2. e.DataItem = dataItem;  
  3. e.RowIndex = index;  
  4. e.RowType = rowType;  
  5. e.Item = row;  
  6. OnHeadlineRowDataBound(e);  

請注意,只在要引發數據綁定事件時才設置 DataItem 屬性。事件數據結構被任意設置為以下形式。如果您認為有必要,盡可以對其進行更改。

  1. public class HeadlineRowEventArgs :EventArgs  
  2. {  
  3. public HeadlineItem DataItem;  
  4. public HeadlineRowType RowType;  
  5. public int RowIndex;  
  6. public HeadlineRow Item;  
  7. }  

若要實際引發一個事件,通常的做法是使用一個如下定義的受保護方法。

  1. protected virtual void OnHeadlineRowDataBound(HeadlineRowEventArgs e)  
  2. {  
  3. if (HeadlineRowDataBound != null)  
  4. HeadlineRowDataBound(this, e);  
  5. }  

若要聲明此事件,可在 ASP.NET 2.0 中使用新的一般事件處理程序委托。

  1. public event EventHandler< HeadlineRowEventArgs> HeadlineRowDataBound;  

在示例頁中,一切均照常執行。您可在控件標記上定義處理程序并將某方法寫入代碼文件。示例如下。

  1. < cc1:HeadlineListEx runat="server" ID="HeadlineListEx1"   
  2. DataTextField="notes" DataTitleField="lastname"   
  3. DataSourceID="MySource" OnHeadlineRowDataBound="HeadlineRowCreated" /> 

HeadlineRowCreated 事件處理程序的代碼顯示如下。

  1. protected void HeadlineRowCreated(object sender, HeadlineRowEventArgs e)  
  2. {  
  3. if (e.DataItem.Title.Contains("Doe"))  
  4. e.Item.BackColor = Color.Red;  
  5. }  
  6.   

運行中的 HeadlineListEx 控件 

圖 7:運行中的 HeadlineListEx 控件

通過掛接數據綁定事件,所有含有 Doe 的項都將以紅色背景呈現。

【編輯推薦】

  1. ASP.NET復合控件與CompositeControl類
  2. ASP.NET復合控件的呈現引擎
  3. ASP.NET復合控件簡介及要點一覽
  4. ASP.NET控件開發基礎之復合控件事件處理淺析
  5. ASP.NET控件開發基礎之復合控件淺析
責任編輯:yangsai 來源: MSDN
相關推薦

2009-08-07 15:34:15

ASP.NET數據綁定

2009-08-06 18:32:00

ASP.NET控件開發ASP.NET復合控件

2009-08-07 15:32:28

ASP.NET復合控件

2009-08-07 15:40:10

CompositeCo復合控件

2009-08-03 18:15:05

ASP.NET數據綁定

2009-08-05 17:43:48

ASP.NET 2.0

2009-08-06 18:18:27

ASP.NET控件開發ASP.NET復合控件

2009-07-30 16:52:38

復合控件ASP.NET服務器控

2009-07-28 14:06:28

ASP.NET 2.0

2009-07-22 17:21:27

ASP.NET 2.0

2009-08-07 14:55:15

ASP.NET復合控件

2009-08-05 17:58:53

自定義集合ASP.NET 2.0

2009-08-06 13:08:23

ASP.NET控件開發

2009-07-24 17:15:52

SiteMapData

2009-08-04 15:20:59

ASP.NET數據驗證數據驗證控件

2009-08-19 13:44:00

ASP.NET Lis

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-08-04 10:43:59

ASP.NET控件開發

2009-08-05 15:57:03

ASP.NET控件ID

2009-07-27 17:25:53

ASP.NET驗證控件
點贊
收藏

51CTO技術棧公眾號

国产偷国产偷亚洲高清97cao| 中日韩男男gay无套| 最新av在线免费观看| 精品国产乱码久久久久久图片| 精品一区二区三区无码视频| 久久九九精品99国产精品| 亚洲综合色噜噜狠狠| 久久九九99| 国产欧美视频在线| 国产 国语对白 露脸| 欧美精品www在线观看| 秋霞在线观看一区二区三区| 国产精品嫩草影院com| 日韩在线你懂的| 高清视频在线www色| 91在线中文字幕| 欧美日韩精品一区二区三区| 日本午夜精品视频在线观看 | 日韩欧美国产综合在线一区二区三区 | 日韩精品永久网址| 四虎影视2018在线播放alocalhost| 91视频最新| 精品国产污网站| 99re成人在线| 成人3d动漫在线观看| 男人的天堂在线视频免费观看 | 日韩国产在线看| 3d性欧美动漫精品xxxx软件| www成人免费| 久久久久久伊人| 欧美性猛交xxxx久久久| 激情六月综合| 日韩伦理三区| 久久久久久久久久久久久久久久久久久| 91老司机在线| 亚洲精品理论电影| 久久精品一区二区三区不卡| 天天综合网91| 国产盗摄一区二区| 爱情岛论坛vip永久入口| 5566av亚洲| 亚洲色图美腿丝袜| 亚洲制服丝袜在线| xxxx一级片| 狠狠精品干练久久久无码中文字幕| 国产欧美日本在线| 亚洲自拍欧美色图| 成人免费在线视频网址| 欧美在线视频播放| 2019中文字幕免费视频| 2018日韩中文字幕| 国产精品视频自在线| 96pao国产成视频永久免费| 国产精品美女在线| 91极品视频在线| 97人人做人人爱| 国产一区二区三区的电影| 欧美第一视频| 免费网站成人| 日韩欧美影院| 亚洲精品国产欧美| 久久先锋影音av鲁色资源| 亚洲乱码在线| 91国拍精品国产粉嫩亚洲一区| 中文字幕视频在线免费| 欧美黑人在线观看| 91日韩久久| 国产亚洲一区二区在线观看| 欧美国产精品专区| 亚洲成人精品在线观看| 91精品福利在线一区二区三区| 精品国产百合女同互慰| 欧美尺度大的性做爰视频| 久久久久久久久国产| 国产精品久久999| 国产在线一区二| 加勒比成人在线| 国产精品日日摸夜夜摸av| 亚洲一区二区三区高清| 欧美绝顶高潮抽搐喷水合集| 精精国产xxxx视频在线中文版| 国产精品久久久久永久免费看| 一区二区不卡在线视频 午夜欧美不卡'| 5252色成人免费视频| 亚洲免费视频观看| 欧美三级一区二区| 夜夜嗨av一区二区三区四季av | 亚洲1卡2卡3卡4卡乱码精品| 男女羞羞视频教学| 日韩电影中文字幕| 91精品福利视频| 一区二区三区四区激情| www.亚洲在线| 麻豆高清免费国产一区| 亚洲天堂成人| 波多野结衣的一区二区三区| 亚洲综合在线做性| 69中国xxxxxxxxx69| 在线观看特色大片免费视频| 日本免费一区二区视频| 国产区一区二区三区| 91wwwcom在线观看| 中文字幕亚洲第一| 欧美成人猛片aaaaaaa| 精品福利在线看| 国产精品不卡视频| 久久综合九色综合97婷婷| 韩国精品在线观看| 视频在线观看国产精品| 欧美日韩国产色综合一二三四| 视频小说一区二区| 91蜜桃臀久久一区二区| 久久久加勒比| 一二区成人影院电影网| 97在线看福利| 成年人黄色在线观看| 国产激情视频在线| 99视频精品全国免费| 夜夜亚洲天天久久| 欧美日韩成人网| 中文视频一区视频二区视频三区| 国产中文在线视频| 中文字幕人成人乱码| 亚洲欧美日本在线| 高清成人在线观看| 欧美日韩亚洲视频| 成人在线视频网| 国产伦一区二区三区色一情| 午夜两性免费视频| 色多多视频在线观看| 日韩五码电影| 国产成人精品一区二区三区四区| 欧美xxxxxxxx| 在线视频三级| 欧美无砖专区一中文字| 蜜臀av性久久久久蜜臀av麻豆| 亚洲精品激情| 亚洲欧美日本视频在线观看| 欧美黄色大片网站| 亚洲无线视频| 羞羞视频在线观看欧美| 视频一区二区中文字幕| 亚洲欧美在线播放| 黄网站欧美内射| 欧美亚洲大陆| 亚洲成人福利片| 成人午夜在线观看| 在线观看中文字幕| 亚洲乱码电影| 欧美v国产在线一区二区三区| 欧美日韩免费精品| 欧美亚洲人成在线| 亚洲高清免费观看| 俄罗斯精品一区二区| 日本中文在线观看| 成人午夜短视频| 日韩美女免费线视频| a视频网址在线观看| 国产成人在线视频播放| 欧美亚洲一区在线| 国产成人一区二区三区小说| 国产精品亚洲二区在线观看 | 欧美激情videos| 爆乳熟妇一区二区三区霸乳| 特黄特色欧美大片| 精品国产成人在线| 97超碰人人澡| 91视频欧美| 日韩精品久久理论片| 中文综合在线观看| 人人妻人人添人人爽欧美一区| 中文字幕日韩在线| 在线播放/欧美激情| 成年人黄视频在线观看| 精品国产一区二区亚洲人成毛片| 99视频国产精品| 国产精品久久久久精k8| 亚洲成人一二三| 欧美一个色资源| 色先锋资源久久综合5566| 欧美精品xxx| 91最新国产视频| 自拍偷拍99| 国产日韩一区二区| 97se亚洲综合| 国产精品久久久久av蜜臀| 欧美精品一区二区久久久| 成人毛片免费在线观看| 国产乱子伦视频一区二区三区| 国产精品毛片va一区二区三区| 亚洲一区二区三区四区| 色婷婷综合激情| 亚洲这里只有精品| av一区二区三区在线| 亚洲ai欧洲av| 忘忧草精品久久久久久久高清| 欧美成人免费网| 免费电影日韩网站| 精品成人私密视频| 美女欧美视频在线观看免费 |