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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

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

發布時間:2023/12/13 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp.net控件开发基础(19) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上兩篇討論了基本數據綁定控件的實現步驟,基本上我們按著步驟來就可以做出簡單的數據綁定控件了。過年前在看DataGrid的實現,本來想寫這個的,但2.0出了GridView了,再說表格控件實現比較復雜,所以先放著。我們一起打開MSDN來看點別的,當然主題還是離不開數據綁定控件。

????????
一.數據綁定控件的模板

打開MSDN一看,我們會發現DataList和DataGrid都不是直接繼承自WebControl類的,而是繼承自一個叫BaseDataList的類。唯獨Repeater是直接繼承自WebControl類的,Repeater的簡單也就代表定義樣式的靈活。DataList和DataGrid則是規規矩矩的經過加工的列表控件。

再看看BaseDataList,其是一個抽象類。其為數據列表控件提供了公共的列表樣式,屬性,布局。
并定義了兩個抽象方法CreateControlHierarchy方法和PrepareControlHierarchy方法,留給子類實現,這兩個方法上兩篇,我們都認識過了。主要是因為定義了不同模板和樣式。可以說是一個典型的模板類



如果你也需要寫一個基于表格的數據綁定控件,可以跳過從WebControl繼承,優先考慮從BaseDataList開始。如果這個抽象類無法滿足需求,那你便放棄他。自己定義一個抽象類,定義公共的屬性,方法等,這樣對以后的擴展有利。當然一般情況下,我們的需求就夠用了。
這里我們可以結合設計模式的學習得出的一個結論:把公用的成員抽象出來


說到這里,我們漏掉了一個數據綁定控件的一個大話題,列表綁定控件,DropDownList,ListBox,CheckBoxList等

下面來看看Repeater版本的DropDownList

????????<asp:SqlDataSource?ID="SqlDataSource1"?runat="server"?ConnectionString="<%$?ConnectionStrings:NorthwindConnectionString?%>"
????????????SelectCommand
="SELECT?top?3?[ProductID],?[ProductName]?FROM?[Alphabetical?list?of?products]">
????????
</asp:SqlDataSource>
????????
<asp:Repeater?ID="Repeater1"?runat="server"?DataSourceID="SqlDataSource1">
????????
<HeaderTemplate>
????????????
<select?id="Select1">
????????
</HeaderTemplate>
????????
<ItemTemplate>
???????
<option><%#?Eval("ProductName")%></option>
????????
</ItemTemplate>
????????
<FooterTemplate>
????????
</select>
????????
</FooterTemplate>
????????
</asp:Repeater>
????????
<asp:DropDownList?ID="DropDownList2"
?????????DataTextField
="ProductName"
??????????runat
="server"?DataSourceID="SqlDataSource1">
????????
</asp:DropDownList>
其實現效果和DropDownList一模一樣。Repeater靈活,但這種做法并不優雅。列表控件也有一個抽象類ListControl。列表控件從此類派生。2.0新加了一個控件BulletedList.相信大家對這幾個控件是絕對的很熟悉,常與其打交道,我們就一起來看看他們是怎么實現的。

??????????System.Web.UI.WebControls.ListControl
???????????? System.Web.UI.WebControls.BulletedList
???????????? System.Web.UI.WebControls.CheckBoxList
???????????? System.Web.UI.WebControls.DropDownList
???????????? System.Web.UI.WebControls.ListBox
???????????? System.Web.UI.WebControls.RadioButtonList


二.列表綁定控件

(1)抽象類
ListControl及相關類

BaseDataList一樣ListControl也為列表控件提供的公共成員。根據我們的平時使用,列表控件都具有以下功能

1.提供DataTextFormatString屬性,可以對綁定數據文本進行格式化
2.提供數據源屬性DataSource和DataMember屬性
3.提供DataTextField屬性和DataValueField屬性,分別為列表控件數據項提供列表顯示文本和值的數據源字段
4.提供了ListItem,代表列表控件的數據項,此需要實現一個迭代,比數據綁定的做法更加靈活
5.提供ListItemCollection,代表ListItem項集合
6.提供SelectedIndex屬性和SelectedItem屬性進行索引
7.提供SelectedIndexChanged事件并實現IEditableTextControl接口,實現TextChanged事件
8.提供AutoPostBack屬性當用戶更改列表中的選定內容時可以向服務器自動回發

其他還有2.0新增的一些功能,就別再介紹了,大家可以看看MSDN

做了上面這么多工作,接下來的工作就比較的輕松了。

(2)具體子類控件

根據功能的不同,可以把內置的5個控件歸為三類,為什么這么分,可以看看此類圖

1.ListBox和DropDownList?
2.CheckBoxList和RadioButtonList
3.BulletedList

這三類控件從ListControl派生,并根據自身功能的不同進行了一些調整

第一類實現最簡單,ListControl本身為其默認實現了很多,其只需要根據自身需求,重寫幾個方法就可以了
第二類控件為復合控件,其實現了IRepeatInfoUser接口,此接口任何重復項列表的列表控件實現的屬性和方法,大多為空實現,主要實現了RenderItem方法。其還定義了控件的布局和現實方法并直接重寫了Render方法,然后用RepeatInfo類來根據RepeatDirection的不同呈現項信息
第三類控件為新增控件,顯示一個項列表

要看出不同,則可以根據生成的html代碼進行比較

(3)具體實現

1.簡單實現一個DropDownList,可能就LoadPostData方法稍微復雜點,其他的應該都沒什么


public?class?CustomDropDownList?:?ListControl,?IPostBackDataHandler
????
{

????????[DefaultValue(
0),?
????????DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
????????
public?override?int?SelectedIndex
????????
{
????????????
get
????????????
{
????????????????
int?selectedIndex?=?base.SelectedIndex;
????????????????
if?((selectedIndex?<?0)?&&?(this.Items.Count?>?0))
????????????????
{
????????????????????
this.Items[0].Selected?=?true;
????????????????????selectedIndex?
=?0;
????????????????}

????????????????
return?selectedIndex;
????????????}

????????????
set
????????????
{
????????????????
base.SelectedIndex?=?value;
????????????}

????????}



????????
protected?override?void?AddAttributesToRender(HtmlTextWriter?writer)
????????
{
????????????
string?uniqueID?=?this.UniqueID;
????????????
if?(uniqueID?!=?null)
????????????
{
????????????????writer.AddAttribute(HtmlTextWriterAttribute.Name,?uniqueID);
????????????}

????????????
base.AddAttributesToRender(writer);
????????}


????????
protected?override?ControlCollection?CreateControlCollection()
????????
{
????????????
base.CreateControlCollection();
????????}


????????
IPostBackDataHandler?成員#region?IPostBackDataHandler?成員

????????
public?bool?LoadPostData(string?postDataKey,?System.Collections.Specialized.NameValueCollection?postCollection)
????????
{
????????????
string[]?values?=?postCollection.GetValues(postDataKey);
????????????
this.EnsureDataBound();
????????????
if?(values?!=?null)
????????????
{
????????????????ListItem?selectitem?
=?Items.FindByValue(values[0]);
???????????????
????????????????
int?selectedIndex?=?this.Items.IndexOf(selectitem);
????????????????
if?(this.SelectedIndex?!=?selectedIndex)
????????????????
{
????????????????????
//設置selected屬性
????????????????????base.SetPostDataSelection(selectedIndex);
????????????????????
return?true;
????????????????}

????????????}

????????????
return?false;
????????}


????????
public?void?RaisePostDataChangedEvent()
????????
{
????????????OnSelectedIndexChanged(EventArgs.Empty);
????????}


????????
#endregion

????}


2. 第二類控件比較復雜,如CheckBoxList是一個CheckBox項列表,其實現了IRepeatInfoUser接口,實現此接口的有如
CheckBoxList、DataList、RadioButtonList。下面說明實現步驟

???public?class?CustomCheckBoxList:?ListControl,?IRepeatInfoUser,
????????????????????INamingContainer,?IPostBackDataHandler
????
{
???}


2.1 實現IRepeatInfoUser接口

IRepeatInfoUser接口定義了重復項列表的列表控件實現的屬性和方法

RenderItem方法用于呈現其中的一項信息。如下代碼

protected?virtual?void?RenderItem(ListItemType?itemType,
????????????????????
int?repeatIndex,
????????????????????RepeatInfo?repeatInfo,
????????????????????HtmlTextWriter?writer)
???????????
{
???????????????ListItem?item?
=?Items[repeatIndex];
???????????????check_box.Attributes.Clear();
???????????????
if?(item.Attributes.Count>0)
???????????????
{
???????????????????
foreach?(string?text?in?item.Attributes.Keys)
???????????????????
{
???????????????????????
this.check_box.Attributes[text]?=?item.Attributes[text];
???????????????????}

???????????????}


???????????????check_box.ID?
=?repeatIndex.ToString(CultureInfo.InvariantCulture);
???????????????check_box.Text?
=?item.Text;
???????????????check_box.Checked?
=?item.Selected;
???????????????check_box.TextAlign?
=?TextAlign;
???????????????check_box.Enabled?
=?Enabled;
???????????????check_box.RenderControl(writer);
???????????}


2.2呈現

CheckBoxList為復合控件,本該重寫TagKey屬性和CreateChildControls方法等,而是在構造函數中添加了CheckBox。.net提供了一個RepeatInfo的輔助類,其與實現IRepeatInfoUser接口的控件搭配使用,此類的RenderRepeater方法會調用CheckBoxList的RenderItem方法,然后根據控件的布局自上而下呈現項列表信息。要區分清楚RenderItem方法位呈現一條項信息,RenderRepeater方法是呈現列表信息
此實現過程在Render方法中實現,而非RenderContents方法.

???????????protected?override?void?Render(HtmlTextWriter?writer)
???????????
{

???????????????RepeatInfo?ri?
=?new?RepeatInfo();
???????????????
//設置呈現布局
???????????????ri.RepeatColumns?=?RepeatColumns;
???????????????ri.RepeatDirection?
=?RepeatDirection;
???????????????ri.RepeatLayout?
=?RepeatLayout;

???????????????
short?ti?=?0;
???????????????
if?(TabIndex?!=?0)
???????????????
{
???????????????????check_box.TabIndex?
=?TabIndex;
???????????????????ti?
=?TabIndex;
???????????????????TabIndex?
=?0;
???????????????}


???????????????
//呈現項列表信息
???????????????ri.RenderRepeater(writer,?this,?ControlStyle,?this);

???????????????
if?(ti?!=?0)
???????????????????TabIndex?
=?ti;
???????????}

2.3預呈現
將CheckBoxList中屬性賦給子控件,在呈現之前執行必要的預呈現


?????protected?override?void?OnPreRender(EventArgs?e)
???????????
{
???????????????
base.OnPreRender(e);

???????????????check_box.AutoPostBack?
=?AutoPostBack;
???????????????check_box.CausesValidation?
=?CausesValidation;
???????????????check_box.ValidationGroup?
=?ValidationGroup;

???????????????
???????????????
//自動回傳
???????????????for?(int?i?=?0;?i?<?Items.Count;?i++)
???????????????
{
???????????????????
if?(Items[i].Selected)
???????????????????
{
???????????????????????check_box.ID?
=?i.ToString(CultureInfo.InvariantCulture);
???????????????????????Page.RegisterRequiresPostBack(check_box);
???????????????????}

???????????????}

???????????}

2.4實現IPostBackDataHandler,當選中時,postCollection[postDataKey]為"on"


?????????protected?virtual?bool?LoadPostData(string?postDataKey,?NameValueCollection?postCollection)
???????????
{
???????????????
int?checkbox?=?-1;

???????????????
try
???????????????
{
???????????????????
string?id?=?postDataKey.Substring(ClientID.Length?+?1);
???????????????????
if?(Char.IsDigit(id[0]))
???????????????????????checkbox?
=?Int32.Parse(id,?CultureInfo.InvariantCulture);
???????????????}

???????????????
catch
???????????????
{
???????????????????
return?false;
???????????????}


???????????????
if?(checkbox?==?-1)
???????????????????
return?false;

???????????????
string?val?=?postCollection[postDataKey];
???????????????
bool?ischecked?=?val?==?"on";
???????????????ListItem?item?
=?Items[checkbox];

???????????????
if?(item.Selected?!=?ischecked)
???????????????
{
???????????????????item.Selected?
=?ischecked;
???????????????????
return?true;
???????????????}


???????????????
return?false;
???????????}

到這里實現的就差不多了,BulletedList的實現就不再寫了。總之控件在不同生命周期完成了不同的事,一步一步的下來就成就了一個控件。

在模板控件中使用的注意點:
記得我以前在用radiobuttonlist時,遇到過一個問題.我想在一個表格中實現一個很簡單的效果,如下圖



剛開始我以為很簡單,把radiobutton放在Repeater里面,radiobutton的GroupName是跟著ID變的。
卻忘了服務器控件進了Repeater模板里面其ID屬性就會重命名,這帶來了很多的不便。于是我想用radiobuttonlist,radiobuttonlist呈現后則為一個表格,不夠靈活,我就不得不重寫其布局。
更討厭的是由于radiobutton需要Text屬性,其不同于DropDownList(其實DropDownList和ListBox才算的上是名副其實的列表控件),所以無法將input作為父標簽,為了共享WebControl成員,只得多加個span標簽,其重寫了最后呈現如下

<span?style="color:Red;"><input?id="RadioButton1"?type="radio"?name="RadioButton1"?value="RadioButton1"?/><label?for="RadioButton1">測試</label></span>
雖然2.0中添加了InputAttributesLabelAttributes集合屬性,但name屬性已經定死了。或者就是再添加一個重復的name屬性,或者就是再重新寫一個?這個算不算是缺點? 感覺用起來就是不順心。

感覺越到下面問題越多了,如果有錯誤還請指出。這次主要學習下如何自定義列表控件,接著打算開始記錄下2.0新增的數據源控件如何實現。

示例代碼

轉載于:https://www.cnblogs.com/hunterzou/archive/2008/12/19/1358569.html

總結

以上是生活随笔為你收集整理的asp.net控件开发基础(19)的全部內容,希望文章能夠幫你解決所遇到的問題。

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