成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET復(fù)合控件引發(fā)數(shù)據(jù)綁定事件

開發(fā) 后端
本文介紹如何使用ASP.NET復(fù)合控件引發(fā)數(shù)據(jù)綁定事件。

生成數(shù)據(jù)綁定ASP.NET復(fù)合控件

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

DataGrid 由一列行構(gòu)成,每一行都代表綁定數(shù)據(jù)源中的一個(gè)記錄。每個(gè)網(wǎng)格行都通過一個(gè) DataGridRow 對象(從 TableRow 派生的一個(gè)類)表示。在各網(wǎng)格行創(chuàng)建完成并被添加到最終網(wǎng)格表時(shí),諸如 ItemCreated 和 ItemDataBound 之類的相應(yīng)事件將被引發(fā)至頁面。當(dāng)通過數(shù)據(jù)綁定創(chuàng)建 DataGrid 時(shí),其行數(shù)由綁定項(xiàng)數(shù)和頁面大小決定。如果帶有 DataGrid 的頁面回發(fā)會(huì)怎樣?

這種情況下,如果是由 DataGrid 自身引起的回發(fā)(例如,用戶單擊以進(jìn)行排序或標(biāo)頁),則新頁面會(huì)再次通過數(shù)據(jù)綁定來呈現(xiàn) DataGrid。這是顯而易見的,因?yàn)?DataGrid 需要刷新數(shù)據(jù)進(jìn)行顯示。如果是主頁回發(fā),則情況就不同了,因?yàn)閱螕袅隧撁嫔系牧硪粋€(gè)控件(例如某按鈕)。這種情況下,DataGrid 不綁定到數(shù)據(jù)并且必須從視圖狀態(tài)進(jìn)行重建。(如果禁用了視圖狀態(tài),就是另外一種情況了,這時(shí)只能通過數(shù)據(jù)綁定顯示網(wǎng)格。)

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

讓我們嘗試使用一種顯示可擴(kuò)展數(shù)據(jù)綁定新聞標(biāo)題行的網(wǎng)格類控件。在此過程中,我們將再度使用在前文中論及的 Headline 控件。

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

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

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

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

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

替換 CreateChildControls。

實(shí)現(xiàn) Rows 集合屬性以跟蹤控件的所有構(gòu)成項(xiàng)。

Rows 屬性不同于 Items,因?yàn)樗槐4嬖谝晥D狀態(tài)中,且具有與請求相同的生存期,并引用幫助程序?qū)ο蠖皇墙壎〝?shù)據(jù)項(xiàng)。

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

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

  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. // 開始生成控件層次結(jié)構(gòu)  
  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.  

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

  1. HeadlineRow CreateHeadlineRow(Table t, HeadlineRowType rowType,   
  2. HeadlineItem dataItem, int index, bool dataBinding)  
  3. {  
  4. // 為最外部表創(chuàng)建新行  
  5. HeadlineRow row = new HeadlineRow(rowType);  
  6.  
  7. // 為子控件創(chuàng)建單元格  
  8. TableCell cell = new TableCell();  
  9. row.Cells.Add(cell);  
  10. Headline item = new Headline();  
  11. cell.Controls.Add(item);  
  12.  
  13. // 此時(shí)引發(fā) HeadlineRowCreated 事件  
  14.  
  15. // 將此行添加到所創(chuàng)建的 HTML 表  
  16. t.Rows.Add(row);  
  17.  
  18. // 處理數(shù)據(jù)對象綁定  
  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. // 此時(shí)引發(fā) HeadlineRowDataBound 事件  
  27.     }  
  28. return row;  
  29. }  
  30.  

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

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

請注意,該模式更準(zhǔn)確描述了ASP.NET復(fù)合控件的內(nèi)部體系結(jié)構(gòu)。

可以使用以下代碼來引發(fā)事件。

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

請注意,只在要引發(fā)數(shù)據(jù)綁定事件時(shí)才設(shè)置 DataItem 屬性。事件數(shù)據(jù)結(jié)構(gòu)被任意設(shè)置為以下形式。如果您認(rèn)為有必要,盡可以對其進(jìn)行更改。

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

若要實(shí)際引發(fā)一個(gè)事件,通常的做法是使用一個(gè)如下定義的受保護(hù)方法。

  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;  

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

  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.   

運(yùn)行中的 HeadlineListEx 控件 

圖 7:運(yùn)行中的 HeadlineListEx 控件

通過掛接數(shù)據(jù)綁定事件,所有含有 Doe 的項(xiàng)都將以紅色背景呈現(xiàn)。

【編輯推薦】

  1. ASP.NET復(fù)合控件與CompositeControl類
  2. ASP.NET復(fù)合控件的呈現(xiàn)引擎
  3. ASP.NET復(fù)合控件簡介及要點(diǎn)一覽
  4. ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件事件處理淺析
  5. ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件淺析
責(zé)任編輯:yangsai 來源: MSDN
相關(guān)推薦

2009-08-07 15:34:15

ASP.NET數(shù)據(jù)綁定

2009-08-06 18:32:00

ASP.NET控件開發(fā)ASP.NET復(fù)合控件

2009-08-07 15:32:28

ASP.NET復(fù)合控件

2009-08-07 15:40:10

CompositeCo復(fù)合控件

2009-08-03 18:15:05

ASP.NET數(shù)據(jù)綁定

2009-08-05 17:43:48

ASP.NET 2.0

2009-08-06 18:18:27

ASP.NET控件開發(fā)ASP.NET復(fù)合控件

2009-07-30 16:52:38

復(fù)合控件ASP.NET服務(wù)器控

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復(fù)合控件

2009-08-05 17:58:53

自定義集合ASP.NET 2.0

2009-08-06 13:08:23

ASP.NET控件開發(fā)

2009-07-24 17:15:52

SiteMapData

2009-08-04 15:20:59

ASP.NET數(shù)據(jù)驗(yàn)證數(shù)據(jù)驗(yàn)證控件

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-08-05 15:57:03

ASP.NET控件ID

2009-08-19 13:44:00

ASP.NET Lis

2009-08-04 10:43:59

ASP.NET控件開發(fā)

2009-07-27 13:52:36

Panel控件ASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91av精品 | 久久久久se | av二区三区 | 99精品久久久国产一区二区三 | 亚洲瑟瑟| 国产精品自产拍在线观看蜜 | 国产免费视频 | 国产色黄 | 亚洲视频在线看 | 成在线人视频免费视频 | 成年人免费在线视频 | 国产三级 | 欧洲亚洲视频 | 精品中文字幕一区 | av日韩在线播放 | av免费网站在线观看 | 成人精品 | 在线观看国产 | 日韩在线 | 国产精品不卡一区二区三区 | 久久精品1 | www.99精品 | 日韩午夜激情 | 成人在线视频免费观看 | 欧美一级视频 | 99久久精品视频免费 | 黄色在线免费观看视频网站 | 国产精品美女久久久久久久网站 | 亚洲日日夜夜 | 国产一区欧美 | 91最新在线视频 | 国产精品永久久久久久久www | 国产精品视频在 | 黄色大片网站 | 久久亚洲一区二区三区四区 | 国产日韩欧美一区二区在线播放 | 91色在线| 成人网在线看 | 亚洲www啪成人一区二区麻豆 | 国产精品成人一区二区 | 成人超碰在线 |