asp.net控件开发基础(20)
??????? 上面我們討論了數據綁定控件的做法,但都未涉及到asp.net2.0中數據源控件的用法,讓用慣了數據源控件的人可能感覺不適應。這次我們就開始討論在asp.net2.0中,我們該如何重新定義數據綁定控件。我一直在想,是先討論數據源控件呢,還是先討論數據綁定控件,兩者是密不可分的。在看下文之前,我想大家應該對asp.net2.0中的數據源控件使用的簡易性非常熟悉了。記得園子的開源項目NBear也為大家提供了數據源控件。個人認為數據源控件和數據綁定控件之間存在著一些約定關系,學習還當從易到難,這里就假定我們對內置的數據源已經能夠熟練的使用了。這里就看看如果定義新的數據綁定控件.
一.數據綁定控件新做法
1. 第一種為純代碼做法,這種做法比較的煩瑣
2.新做法數據綁定控件與數據源控件結合.不同之處則是不需要寫重復代碼,?如
????????<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>
????<asp:SqlDataSource?ID="SqlDataSource1"?runat="server"?ConnectionString="<%$?ConnectionStrings:NorthwindConnectionString2?%>"
????????????SelectCommand="SELECT?[CompanyName],?[ContactName]?FROM?[Customers]"></asp:SqlDataSource>
上面的做法是asp.net2.0里面新增的,如果你沒有學過asp.net1.1而直接學2.0的話,上面的寫法是非常簡單的,沒有寫一行的代碼.
這樣的做法可能會讓人產生以下幾點看法
(1)初學者認為asp.net真的很簡單,是的很簡單,在簡單的同時你也該意識到數據源控件為你做了重復的工作,快速開發的同時你是否該了解下上面的做法是如何實現的
(2)接觸過.net一段時間的人則會認為DataSource數據源控件只是小兒科,大項目怎么可以這么做,對其不放心,還是自己手動寫代碼比較放心-_-.
數據源控件好不好用這里不必討論,但我想大多數人還是向其靠攏的.
二.數據綁定控件相同機制
數據綁定控件需要數據源
(1)在沒有數據源控件之前,數據綁定控件需要先給DataDource屬性賦值獲取數據源,然后執行DataBind()方法
(2)在數據源控件出現之后,數據綁定控件仍然需要數據源,只不過方式發生了變化,不是通過DataDource屬性直接的獲取,而是間接的通過數據源控件獲取,然后幫你自動執行了DataBind()方法
所以這里需要注意的是,當設置DataDourceID的時候,不需要再調用DataBind()方法,兩種方法不可同時使用
站在使用者的角度,唯一的變化也就是給我們兩種數據綁定做法的選擇.偷懶的我們當然愿意選擇后一種,一切交給數據源控件為我們處理.
三.數據綁定控件新的起點
上篇我們講到過BaseDataList類 .1.1中的舊的數據綁定控件從此抽象類中繼承下來,而2.0中新的數據綁定控件,并沒有這么做,而是從BaseDataBoundControl類重新開始,以此為基礎.net為我們定義了一些比較實用的類.當然在.net2.0中,BaseDataList類也提供了DataDourceID屬性,但微軟也很明確的表示讓我們棄用DataGrid,使用GridView . 暫時我們先不去想為什么,只有了解以后,我們才能去比較
在微軟的MSDN上,早就有篇文章介紹ASP.NET 2.0 和數據綁定控件:新的角度,新的做法? 大家可以看看
這次我們只需要了解兩個基類
兩個類都為抽象類BaseDataBoundControl類定義了兩個抽象方法PerformSelect和ValidateDataSource由子類實現.
雖然你不需要對這兩個類的實現了解很多,但你需要知道兩個類為你做了什么.
1.BaseDataBoundControl類大致做了如下工作
定義了基本的DataSource和DataSourceID基本屬性,我們稱為數據源標識
其主要提供了兩種不同做法的實現機制
(1)定義了DataSource,則會驗證數據源的正確性即ValidateDataSource方法(此過程由子類完成),還需要手動調用DataBind方法
(2)定義了DataSourceID,則會自動調用DataBind方法
當定義了以上其中一個屬性時,這個類便幫你做了以下執行過程,所以你還需要了解以下成員
OnDataPropertyChanged 方法(當定義了數據源標識或其發生變化后)
???????????????????????? |
RequiresDataBinding方法(確定要開始調用DataBind方法)
???????????????????????? |
EnsureDataBound 方法(判斷如若定義DataSourceID屬性,則執行DataBind方法,所以此步驟是關鍵點)
???????????????????????? |
DataBind 方法(在次方法中執行了PerformSelect方法檢索數據并把數據綁定到控件,此過程由子類完成)
2.DataBoundControl 類開始真正的與數據源控件開始交互,請看下面主要實現
(1)GetDataSource方法(檢索與數據綁定控件關聯的IDataSource接口,即從DataSourceID屬性屬性)
???????????????????????? |
(2)GetData方法(從數據源控件檢索數據源視圖,這個方法是數據的主要來源)
???????????????????????? |
(3)PerformSelect 方法(從GetData方法中檢索數據,然后調用PerformDataBinding方法)
???????????????????????? |
(4)PerformDataBinding方法(將檢索到的數據綁定到控件上,此方法為空實現,留給子類實現)
注意點:如果未設置DataSourceID屬性,(1)(2)步驟可以省去,從(3)開始必然會執行.
一般情況下,簡單的數據綁定控件留給我們做的只剩下第4個步驟PerformDataBinding方法,你只需要重寫這個方法,獲取控件要呈現的數據就完成了.其他的事情就不需要你操心了.說了這么多,還是來看看示例代碼吧.
四.示例
代碼來自asp.net2.0揭密,我把重復的定義刪除了只留下PerformDataBinding方法
1.從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.方法實現
???????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"?runat="server"?DataSourceID="SqlDataSource1"
????????????DataTextField="CompanyName"?/>
????????
????<asp:SqlDataSource?ID="SqlDataSource1"?runat="server"?ConnectionString="<%$?ConnectionStrings:NorthwindConnectionString2?%>"
????????????SelectCommand="SELECT?[CompanyName],?[ContactName]?FROM?[Customers]"></asp:SqlDataSource>
本次的示例代碼比較簡單,對于繼承的兩個基類,我們還需要多了解下.對其屬性和方法心理有個概念他們的工作是獲取數據,我們的工作是呈現數據,具體如何獲取數據,我們以后來看數據源控件的實現方法.
以上純屬經驗之談,說錯了還請大家指正-_-
轉載于:https://www.cnblogs.com/Clingingboy/archive/2007/03/12/DataBoundControl.html
總結
以上是生活随笔為你收集整理的asp.net控件开发基础(20)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Altera FPGA 远程更新
- 下一篇: Win10怎么录制内部声音 内录软件哪个