asp.net控件開發基礎(17) --------初識數據綁定控件

首先請下載示例代碼
        
本篇將開始介紹如自定義數據綁定控件,這裏感謝很多人的支持,有你們的支持很高興.

這裏首先需要大家熟悉asp.net模板控件的使用,還有自定義模板控件.因爲數據綁定控件多是基於模板控件的.


一.回顧

如果你使用過asp.net內置的數據控件(如DataList,Repeater),你一定會這麼做


1.設置數據源 DataSource屬性
2.調用數據綁定  DataBind方法
3.在控件的不同模板內使用綁定語法顯示數據

這三步應該是必須要做的

其他更多的

你可能需要對綁定的數據進行統一的一些操作(如時間格式化),或者對數據的某一項進行操作(對某一項進行格式化),或者需要觸發模板控件內的一些事件(如databound事件).

根據上面的一些需求,我們需要這樣做

1.對綁定的數據進行統一的一些操作: 爲數據綁定控件定義Item項(表示列表的一條數據, 如Repeater的RepeaterItem)

2.對數據的某一項進行操作:
因爲定義了Item項,那你肯定需要一個ItemCollection集合,其可以方便的爲你檢索數據

3.因爲定義了RepeaterItem,原先的EventArgs和CommandEventArgs已經無法滿足需求,我們需要自定義委託及其一個爲控件提供數據的的ItemEventArgs

上面三點有些並非必須定義,如第2點,還需要根據具體需求來定.但一個完成的控件是需要的.


二.爲數據控件做好準備

這次的demo爲不完整的Datalist控件,來源還是MSDN的例子,我們命名爲TemplatedList,此控件未定義ItemCollection集合

好了,根據上面的分析我們先爲TemplatedList提供項和委託及爲事件提供數據的幾個EventArgs,請看下面類圖





1.TemplatedListCommandEventArgs爲Command事件提供數據

2.TemplatedListItemEventArgs爲一般項提供數據

3.TemplatedListItem表示TemplatedList的項

三.編寫TemplatedList

1.TemplatedList主要功能簡介

提供一個ItemTemplate模板屬性,提供三種不同項樣式,ItemCommand 事件冒泡事件及4個事件





2.實現主要步驟

以下爲必須

(1)控件必須實現 System.Web.UI.INamingContainer 接口

(2)定義至少一個模板屬性

(3)定義DataSource數據源屬性

(4)定義控件項DataItem,即模板的一個容器

(5)重寫DataBind 方法及複合控件相關方法(模板控件爲特殊的複合控件)

當然還有其他額外的屬性,樣式,事件


3.具體實現



下面我們來具體看實現方法

(1)定義控件成員屬性



成員如下(可以看上面類圖)

1.三個項樣式和三個樣式屬性

2.公開DataSource數據源屬性,一個模板屬性

3.SelectedIndex索引屬性

前面的相信大家都很容易明白,其中的三個項樣式我們需要爲其重寫視圖狀態管理,不熟悉可以看以前的隨筆,這裏不再重複.

SelectedIndex屬性比較複雜,這裏重點介紹此屬性

SelectedIndex索引屬性默認爲-1,

我給出了註釋,在賦值前先記錄下了上次的選中項,爲恢復樣式而做準備

                //獲取上次選中項
                int oldSelectedIndex = SelectedIndex;
                ViewState[
"SelectedIndex"= value;


當第一次更改SelectedIndex屬性時只執行下列代碼(將此項標記爲選中項),因爲初始化時的沒有oldSelectedIndex,不需要恢復樣式

//第一次執行此項,並一直執行
                    if ((value != -1&& (table.Rows.Count > value))
                    
{
                        item 
= (TemplatedListItem)table.Rows[value];
                        item.SetItemType(ListItemType.SelectedItem);
                    }

再次執行時,恢復oldSelectedIndex選中項樣式
                    //第一次選中項不執行
                    if ((oldSelectedIndex != -1&& (table.Rows.Count > oldSelectedIndex))
                    
{
                        item 
= (TemplatedListItem)table.Rows[oldSelectedIndex];
                        
//判斷項類型,爲了將選中項還原爲數據項
                        if (item.ItemType != ListItemType.EditItem)
                        
{
                            ListItemType itemType 
= ListItemType.Item;
                            
if (oldSelectedIndex % 2 != 0)
                                itemType 
= ListItemType.AlternatingItem;
                            item.SetItemType(itemType);
                        }

                    }

相信這樣的解釋你會明白

(2)定義控件成員事件

我們可以用上剛纔我們聲明的委託了,即然你定義了這麼多事件,就該爲其安排觸發的先後.所以這個要特別注意,等下會再次提到.



(3)關鍵實現

我們爲控件提供了這麼多東西,剩下的事情就是要真正去實現功能了

1.重寫DataBind方法

當控件綁定數據時首先會執行此方法觸發DataBinding事件

        //控件執行綁定時執行
        public override void DataBind()
        
{

            
base.OnDataBinding(EventArgs.Empty);

            
//移除控件
            Controls.Clear();
            
//清除視圖狀態信息
            ClearChildViewState();

            
//創建一個帶或不帶指定數據源的控件層次結構
            CreateControlHierarchy(true);
            ChildControlsCreated 
= true;

            TrackViewState();
        }


2.CreateControlHierarchy方法


CreateItem方法輔助用於創建項模板,此處注意事件觸發順序,上面已經提到過

此方法根據項索引創建控件中不同的Item項 ,ViewState["ItemCount"]表示項的數量,第一次觸發時或者重新執行DataBind方法時方法參數爲true,並在初始化以後(回發期間)CreateChildControls方法會調用此方法,其參數爲false

數據源不再是實際的數據源,而是新定義的DummyDataSource,其主要實現了一個迭代



原因很明顯,爲了減少對數據源的訪問,所以我們平時操作數據的時候,必須重新執行DataBind方法,原因就在此

好了,到了這裏差不多主要的事情我們已經完成.接着把剩下的也完成

3.呈現

又到了Render方法這裏了

此方法體只要執行了PrepareControlHierarchy方法,不同的方法做不同的事情,CreateControlHierarchy方法根據索引值指定了不同的項,PrepareControlHierarchy則爲不同項呈現不同的樣式效果



終於差不多了,經過這麼多步驟,我們終於完成了,讓我們來使用控件,看一下效果



又完成一個並不完美的控件,本來還該繼續下去的,怕篇幅太大,到這裏還沒結束,只是剛開始,下次我們繼續  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章