您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關ASP.NET 2.0中怎么以數據綁定控件自定義集合,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
ASP.NET 2.0數據綁定控件:管理自定義集合
ListControl 是一個過于專用的類,它以不受您控制的固定方式執行數據綁定 — 除非您重寫諸如 PerformSelect、OnDataBinding 和 PerformDataBinding 之類的方法。它還提供了預定義的 Items 集合屬性。讓我們在 ASP.NET 2.0 中的更低級別處理數據綁定,并且設計具有下列功能的 ButtonList 控件:
◆使用自定義集合類來保留組成項
◆用自定義方式管理視圖狀態
ButtonList 控件是另一個為每個綁定數據項輸出按鈕的列表控件。您可以讓它從 ListControl 繼承;而且,您可以獲得 HeadlineList 的源代碼,將 Label 替換為 Button,而它仍然應當正常工作。這一次,我將采用一種不同的方法來說明 DataBoundControl 的行為。為簡單起見,我仍將跳過 IRepeatInfoUser 接口。
public class ButtonList : System.Web.UI.WebControls.DataBoundControl { : }
標題和命令名稱表現了每個按鈕的性質。該信息是通過幾個自定義屬性(如 DataTextField 和 DataCommandField)從綁定數據源中獲得的。您可以容易地添加類似的屬性,以提供數據綁定工具提示,甚至提供 URL。
public virtual string DataCommandField { get { object o = ViewState["DataCommandField"]; if (o == null) return ""; return (string)o; } set { ViewState["DataCommandField"] = value; } }
所發現的有關每個綁定按鈕的所有信息都被填充到一個通過 Items 屬性公開的自定義對象集合中。(請注意,Items 只是該屬性的標準、慣用而任意的名稱。)
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [PersistenceMode(PersistenceMode.InnerProperty)] public virtual ButtonItemCollection Items { get { if (_items == null) { _items = new ButtonItemCollection(); if (base.IsTrackingViewState) _items.TrackViewState(); } return _items; } }
Items 集合是自定義 ButtonItemCollection 類的實例 — ButtonItem 對象的集合。ButtonItem 類只是存儲了有關綁定按鈕的關鍵信息 — Text 和 CommandName 屬性,外加幾個構造函數以及 ToString 方法。ButtonItem 類是作為普通列表控件的 ListItem 類的對等物。下面是一個示例。
public class ButtonItem { private string _text; private string _command; public ButtonItem(string text, string command) { _text = text; _command = command; } public string Text { get {return _text;} set {_text = value;} } public string CommandName { get { return _command; } set { _command = value; } } public override string ToString() { return "Button [" + Text + "]"; } }
現在,如何創建 ButtonItem 對象的集合呢?在 ASP.NET 1.x 中,您必須生成一個從 CollectionBase 繼承的自定義集合類,并且起碼重寫幾個方法。然而,自定義集合只是圍繞 ArrayList 對象的包裝而已,在訪問速度方面并沒有任何真正的優勢。實際上,仍然需要進行轉換。.NET 2.0 中的泛型提供了真正的轉折點。要生成 ButtonItem 對象集合,您需要以下代碼:
public class ButtonItemCollection : Collection < ButtonItem> { }
并且,它的性能也會更好,因為編譯器在幕后完成了某些工作。ButtonList 控件只需要兩個被重寫的方法:Render 和 PerformDataBinding。Render 假定 Items 集合被填充;因此,它只是進行迭代并輸出標記代碼。
protected override void Render(HtmlTextWriter writer) { for(int i=0; i< } btn.RenderControl(writer); btn.CommandName="item.CommandName;" btn.Text="item.Text;" Button(); btn="new" Button item="Items[i];" ButtonItem { i++)>
ASP.NET 2.0數據綁定控件:Items集合的重要性
Items 集合為什么如此重要?它可以幫助您獲得兩個結果。首先,您可以用手動添加的項填充該列表控件。其次,一旦在視圖狀態中持久保存該集合,您就可以在回發時重新生成該控件的用戶界面,而無須綁定到數據。在進行數據綁定時,Items 集合是在何處以及由誰填充的呢?這需要用到 PerformDataBinding。該方法獲得一個可枚舉的數據列表(無論原始數據源是什么)并使用它來填充 Items 集合。
protected override void PerformDataBinding(IEnumerable dataSource) { base.PerformDataBinding(dataSource); string textField = DataTextField; string commandField = DataCommandField; if (dataSource != null) { foreach (object o in dataSource) { ButtonItem item = new ButtonItem(); item.Text = DataBinder.GetPropertyValue(o, textField, null); item.CommandName = DataBinder.GetPropertyValue(o, DataCommandField, null); Items.Add(item); } } }
每當需要進行數據綁定時,該方法都能夠確保 Items 集合被填充。在回發時會發生什么?在這種情況下,必須根據視圖狀態重新構建 Items 集合。您可以通過 IStateManager 接口上的方法賦予自定義集合類這一能力。以下為該接口的關鍵方法:
public void LoadViewState(object state) { if (state != null) { Pair p = (Pair) state; Clear(); string[] rgText = (string[])p.First; string[] rgCommand = (string[])p.Second; for (int i = 0; i < rgText.Length; i++) Add(new ButtonItem(rgText[i], rgCommand[i])); } } public object SaveViewState() { int numOfItems = Count; object[] rgText = new string[numOfItems]; object[] rgCommand = new string[numOfItems]; for (int i = 0; i < numOfItems; i++) { rgText[i] = this[i].Text; rgCommand[i] = this[i].CommandName; } return new Pair(rgText, rgCommand); }
該類使用一個 Pair 對象(一種經過優化的 2 位置數組)將自身序列化為視圖狀態。您需要創建兩個對象數組,以便保留每個按鈕的文本和命令名稱。這兩個數組隨后被成對打包并插入到該視圖狀態中。當還原該視圖狀態時,會將該數組對拆包,并且使用先前存儲的信息重新填充 Items 集合。使用該方法要比使 ButtonItem 類可序列化更可取,因為傳統的二進制格式化程序的性能(在空間和時間這兩個方面)更差。
然而,向集合中添加視圖狀態支持還不夠。還必須增強 ButtonList 控件以利用集合的序列化功能。您可以重寫控件類上的 LoadViewState 和 SaveViewState。
protected override void LoadViewState(object savedState) { if (savedState != null) { Pair p = (Pair) savedState; base.LoadViewState(p.First); Items.LoadViewState(p.Second); } else base.LoadViewState(null); } protected override object SaveViewState() { object baseState = base.SaveViewState(); object itemState = Items.SaveViewState(); if ((baseState == null) && (itemState == null)) return null; return new Pair(baseState, itemState); }
控件的視圖狀態由兩個元素組成:默認控件的視圖狀態以及 Items 集合。這兩個對象被打包到 Pair 對象中。除了 Pair 對象以外,您還可以使用 Triplet 對象(包含三個對象的數組),或者使用 Pair 或 Triplet 對組成任意數量的對象。
以這種方式設計的自定義集合還可以在設計時滿足需要。Visual Studio 2005 中嵌入的默認集合編輯器可以識別該集合并彈出如圖 3 所示的對話框。
ASP.NET 2.0數據綁定控件:設計時的 ButtonList Items 集合
值得說明的是,在 ASP.NET 2.0 中,某些數據綁定控件使您可以將數據綁定項與以編程方式通過 Items 集合添加的項分開。布爾型的 AppendDataBoundItems 屬性用于控制該控件的編程接口的這一方面。該屬性在 ListControl(而非 DataBoundControl)上定義,并且默認為 false。
關于ASP.NET 2.0中怎么以數據綁定控件自定義集合就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。