日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

asp.net控件开发基础(20)

發布時間:2023/12/9 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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類定義了兩個抽象方法PerformSelectValidateDataSource由子類實現.

雖然你不需要對這兩個類的實現了解很多,但你需要知道兩個類為你做了什么.

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繼承

????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.方法實現

???????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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。