中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET 2.0中怎么以數據綁定控件自定義集合

發布時間:2021-07-15 15:41:35 來源:億速云 閱讀:109 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關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中怎么以數據綁定控件自定義集合

ASP.NET 2.0數據綁定控件:設計時的 ButtonList Items 集合

值得說明的是,在 ASP.NET 2.0 中,某些數據綁定控件使您可以將數據綁定項與以編程方式通過 Items 集合添加的項分開。布爾型的 AppendDataBoundItems 屬性用于控制該控件的編程接口的這一方面。該屬性在 ListControl(而非 DataBoundControl)上定義,并且默認為 false。

關于ASP.NET 2.0中怎么以數據綁定控件自定義集合就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐都县| 万安县| 林口县| 贵州省| 晋中市| 泗阳县| 韩城市| 炎陵县| 淳安县| 毕节市| 清水河县| 调兵山市| 娱乐| 临湘市| 大田县| 象州县| 哈密市| 通州市| 齐河县| 娄底市| 华蓥市| 重庆市| 石阡县| 平塘县| 嘉鱼县| 永修县| 黄山市| 岢岚县| 班玛县| 新郑市| 敖汉旗| 大关县| 大丰市| 定结县| 安化县| 定兴县| 荥经县| 吴桥县| 永泰县| 江孜县| 库尔勒市|