ASP.NET2.0數(shù)據(jù)源控件的用法淺析
之前我們討論了數(shù)據(jù)綁定控件的做法,但都未涉及到ASP.NET2.0數(shù)據(jù)源控件的用法,讓用慣了數(shù)據(jù)源控件的人可能感覺不適應(yīng)。這次我們就開始討論在ASP.NET2.0中,我們該如何定義ASP.NET2.0數(shù)據(jù)源控件件。我一直在想,是先討論數(shù)據(jù)源控件呢,還是先討論數(shù)據(jù)綁定控件,兩者是密不可分的。在看下文之前,我想大家應(yīng)該對ASP.NET2.0中的數(shù)據(jù)源控件使用的簡易性非常熟悉了。記得園子的開源項目NBear也為大家提供了數(shù)據(jù)源控件。個人認為數(shù)據(jù)源控件和數(shù)據(jù)綁定控件之間存在著一些約定關(guān)系,學(xué)習(xí)還當(dāng)從易到難,這里就假定我們對內(nèi)置的數(shù)據(jù)源已經(jīng)能夠熟練的使用了。這里就看看如果定義新的數(shù)據(jù)綁定控件.
ASP.NET2.0數(shù)據(jù)源控件一.數(shù)據(jù)綁定控件新做法
1. ***種為純代碼做法,這種做法比較的煩瑣
2.新做法數(shù)據(jù)綁定控件與數(shù)據(jù)源控件結(jié)合.不同之處則是不需要寫重復(fù)代碼, 如
- ﹤asp:GridView ID="GridView1" runat="server"
- DataSourceID="SqlDataSource1" AutoGenerateColumns="False"﹥
- ﹤Columns﹥
- ﹤asp:BoundField DataField="CompanyName"
- HeaderText="CompanyName" SortExpression="CompanyName" /﹥
- ﹤asp:BoundField DataField="ContactName"
- HeaderText="ContactName" SortExpression="ContactName" /﹥
- ﹤/Columns﹥
- ﹤/asp:GridView﹥
- :SqlDataSource ID="SqlDataSource1" runat="server"
- ConnectionString="﹤%$ ConnectionStrings:NorthwindConnectionString2 %﹥"
- SelectCommand="SELECT [CompanyName], [ContactName] FROM [Customers]"﹥﹤/asp:SqlDataSource﹥
上面的做法是ASP.NET2.0里面新增的,如果你沒有學(xué)過ASP.NET1.1而直接學(xué)2.0的話,上面的寫法是非常簡單的,沒有寫一行的代碼.
這樣的做法可能會讓人產(chǎn)生以下幾點看法
(1)初學(xué)者認為ASP.NET真的很簡單,是的很簡單,在簡單的同時你也該意識到數(shù)據(jù)源控件為你做了重復(fù)的工作,快速開發(fā)的同時你是否該了解下上面的做法是如何實現(xiàn)的
(2)接觸過.net一段時間的人則會認為DataSource數(shù)據(jù)源控件只是小兒科,大項目怎么可以這么做,對其不放心,還是自己手動寫代碼比較放心-_-.
數(shù)據(jù)源控件好不好用這里不必討論,但我想大多數(shù)人還是向其靠攏的.
ASP.NET2.0數(shù)據(jù)源控件二.數(shù)據(jù)綁定控件相同機制
數(shù)據(jù)綁定控件需要數(shù)據(jù)源
(1)在沒有數(shù)據(jù)源控件之前,數(shù)據(jù)綁定控件需要先給DataDource屬性賦值獲取數(shù)據(jù)源,然后執(zhí)行DataBind()方法
(2)在數(shù)據(jù)源控件出現(xiàn)之后,數(shù)據(jù)綁定控件仍然需要數(shù)據(jù)源,只不過方式發(fā)生了變化,不是通過DataDource屬性直接的獲取,而是間接的通過數(shù)據(jù)源控件獲取,然后幫你自動執(zhí)行了DataBind()方法
所以這里需要注意的是,當(dāng)設(shè)置DataDourceID的時候,不需要再調(diào)用DataBind()方法,兩種方法不可同時使用
站在使用者的角度,***的變化也就是給我們兩種數(shù)據(jù)綁定做法的選擇.偷懶的我們當(dāng)然愿意選擇后一種,一切交給數(shù)據(jù)源控件為我們處理.
ASP.NET2.0數(shù)據(jù)源控件三.數(shù)據(jù)綁定控件新的起點
上篇我們講到過BaseDataList類 .1.1中的舊的數(shù)據(jù)綁定控件從此抽象類中繼承下來,而2.0中新的數(shù)據(jù)綁定控件,并沒有這么做,而是從BaseDataBoundControl類重新開始,以此為基礎(chǔ).net為我們定義了一些比較實用的類.當(dāng)然在.net2.0中,BaseDataList類也提供了DataDourceID屬性,但微軟也很明確的表示讓我們棄用DataGrid,使用GridView . 暫時我們先不去想為什么,只有了解以后,我們才能去比較
在微軟的MSDN上,早就有篇文章介紹ASP.NET 2.0 和數(shù)據(jù)綁定控件:新的角度,新的做法 大家可以看看
這次我們只需要了解兩個基類
兩個類都為抽象類BaseDataBoundControl類定義了兩個抽象方法PerformSelect和ValidateDataSource由子類實現(xiàn).
雖然你不需要對這兩個類的實現(xiàn)了解很多,但你需要知道兩個類為你做了什么.
1.BaseDataBoundControl類大致做了如下工作
定義了基本的DataSource和DataSourceID基本屬性,我們稱為數(shù)據(jù)源標(biāo)識
其主要提供了兩種不同做法的實現(xiàn)機制
(1)定義了DataSource,則會驗證數(shù)據(jù)源的正確性即ValidateDataSource方法(此過程由子類完成),還需要手動調(diào)用DataBind方法
(2)定義了DataSourceID,則會自動調(diào)用DataBind方法
當(dāng)定義了以上其中一個屬性時,這個類便幫你做了以下執(zhí)行過程,所以你還需要了解以下成員
OnDataPropertyChanged 方法(當(dāng)定義了數(shù)據(jù)源標(biāo)識或其發(fā)生變化后)
RequiresDataBinding方法(確定要開始調(diào)用DataBind方法)
EnsureDataBound 方法(判斷如若定義DataSourceID屬性,則執(zhí)行DataBind方法,所以此步驟是關(guān)鍵點)
DataBind 方法(在次方法中執(zhí)行了PerformSelect方法檢索數(shù)據(jù)并把數(shù)據(jù)綁定到控件,此過程由子類完成)
2.DataBoundControl 類開始真正的與數(shù)據(jù)源控件開始交互,請看下面主要實現(xiàn)
(1)GetDataSource方法(檢索與數(shù)據(jù)綁定控件關(guān)聯(lián)的IDataSource接口,即從DataSourceID屬性屬性)
(2)GetData方法(從數(shù)據(jù)源控件檢索數(shù)據(jù)源視圖,這個方法是數(shù)據(jù)的主要來源)
(3)PerformSelect 方法(從GetData方法中檢索數(shù)據(jù),然后調(diào)用PerformDataBinding方法)
(4)PerformDataBinding方法(將檢索到的數(shù)據(jù)綁定到控件上,此方法為空實現(xiàn),留給子類實現(xiàn))
注意點:如果未設(shè)置DataSourceID屬性,(1)(2)步驟可以省去,從(3)開始必然會執(zhí)行.
一般情況下,簡單的數(shù)據(jù)綁定控件留給我們做的只剩下第4個步驟PerformDataBinding方法,你只需要重寫這個方法,獲取控件要呈現(xiàn)的數(shù)據(jù)就完成了.其他的事情就不需要你操心了.說了這么多,還是來看看示例代碼吧.
ASP.NET2.0數(shù)據(jù)源控件四.示例
代碼來自ASP.NET2.0揭密,我把重復(fù)的定義刪除了只留下PerformDataBinding方法
1.從DataBoundControl繼承
- public class TextBoxSet : DataBoundControl
- {
- }
2.定義屬性
- private IList alBoxSet;
- public IList BoxSet
- {
- get
- {
- if (null == alBoxSet)
- {
- alBoxSet = new ArrayList();
- }
- return alBoxSet;
- }
- }
- public string DataTextField
- {
- get
- {
- object o = ViewState["DataTextField"];
- return ((o == null) ? string.Empty : (string)o);
- }
- set
- {
- ViewState["DataTextField"] = value;
- if (Initialized)
- {
- OnDataPropertyChanged();
- }
- }
- }
3.方法實現(xiàn)
- protected override void PerformDataBinding(IEnumerable retrievedData)
- {
- if (retrievedData != null)
- {
- foreach (object dataItem in retrievedData)
- {
- TextBox box = new TextBox();
- if (DataTextField.Length ﹥ 0)
- {
- box.Text = DataBinder.GetPropertyValue(dataItem,
- DataTextField, null);
- }
- else
- {
- PropertyDescriptorCollection props =
- TypeDescriptor.GetProperties(dataItem);
- box.Text = String.Empty;
- if (props.Count ﹥= 1)
- {
- if (null != props[0].GetValue(dataItem))
- {
- box.Text = props[0].GetValue(dataItem).ToString();
- }
- }
- }
- BoxSet.Add(box);
- }
- }
- }
- protected override void Render(HtmlTextWriter writer)
- {
- if (BoxSet.Count ﹤= 0)
- {
- return;
- }
- if (Page != null)
- {
- Page.VerifyRenderingInServerForm(this);
- }
- writer.RenderBeginTag(HtmlTextWriterTag.Ul);
- foreach (object item in BoxSet)
- {
- TextBox box = (TextBox)item;
- writer.WriteBeginTag("li");
- writer.Write("﹥");
- writer.WriteBeginTag("input");
- writer.WriteAttribute("type", "text");
- writer.WriteAttribute("value", box.Text);
- writer.Write("﹥");
- writer.WriteEndTag("input");
- writer.WriteEndTag("li");
- }
- writer.RenderEndTag();
- }
接下來你便可以使用了
- ﹤aspDemo:TextBoxSet ID="TextBoxSet1" r
- unat="server" DataSourceID="SqlDataSource1"
- DataTextField="CompanyName" /﹥
- ﹤asp:SqlDataSource ID="SqlDataSource1" runat="server"
- ConnectionString="﹤%$ ConnectionStrings:NorthwindConnectionString2 %﹥"
- SelectCommand="SELECT [CompanyName], [ContactName] FROM [Customers]"﹥
- ﹤/asp:SqlDataSource﹥
本次的示例代碼比較簡單,對于繼承的兩個基類,我們還需要多了解下.對其屬性和方法心理有個概念他們的工作是獲取數(shù)據(jù),我們的工作是呈現(xiàn)數(shù)據(jù),具體如何獲取數(shù)據(jù),我們以后來看數(shù)據(jù)源控件的實現(xiàn)方法.
以上純屬經(jīng)驗之談,說錯了還請大家指正-_-
ASP.NET2.0數(shù)據(jù)源控件的基本情況就向你介紹到這里,希望對你了解ASP.NET2.0數(shù)據(jù)源控件有所幫助。
【編輯推薦】