新聞中心
列表控件示例

成都創(chuàng)新互聯(lián)公司專注于花溪網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供花溪營銷型網(wǎng)站建設(shè),花溪網(wǎng)站制作、花溪網(wǎng)頁設(shè)計、花溪網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造花溪網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供花溪網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
數(shù)據(jù)綁定控件通常為列表控件。列表控件通過為它的主框架邊界內(nèi)的每個綁定數(shù)據(jù)項重復(fù)固定的模板,生成它自己的用戶界面。例如,CheckBoxList 控件只是為每個綁定數(shù)據(jù)項重復(fù) CheckBox 控件。同樣,DropDownList 控件遍歷它的數(shù)據(jù)源,并且在 < select > 父標記內(nèi)創(chuàng)建新的 < option > 元素。除了列表控件以外,ASP.NET 還提供了迭代控件。它們有什么不同?
列表控件和迭代控件的不同之處在于被應(yīng)用于每個數(shù)據(jù)項的可重復(fù)模板允許具有的自定義級別。像 CheckBoxList 控件一樣,Repeater 控件遍歷綁定數(shù)據(jù)項并應(yīng)用用戶定義的模板。Repeater(以及更完善的 DataList 控件)極為靈活,但是在使代碼保持模塊化和分層化方面不能提供多少幫助。要使用 Repeater,您需要在該頁(或外部用戶控件)中定義模板,并使用 ASPX 源中的數(shù)據(jù)綁定屬性。它是快速、有效的,有時還是必要的,但肯定不是整潔和優(yōu)雅的。
在 ASP.NET 1.x 中,所有列表控件都從 ListControl(它是表 1 中唯一一個已經(jīng)在 1.x 中定義的類)繼承。讓我們進入編碼猴子模式,并且開始練習(xí)使用 ASP.NET 2.0 中的數(shù)據(jù)綁定控件。我將首先生成一個 HeadlineList 控件,以便為每個數(shù)據(jù)項呈現(xiàn)兩行數(shù)據(jù)綁定文本。此外,該控件還將具備一些布局功能,例如,垂直或水平呈現(xiàn)。
列表控件示例:HeadlineList 示例控件
正如前面提到的那樣,ListControl 是 ASP.NET 1.x 和 2.0 中所有列表控件的基類。非常令人愉快的是,可以用一種非常平滑的方式將在此為 ASP.NET 2.0 編寫的 HeadlineList 控件向后移植到 ASP.NET 1.x。出于某種原因,當(dāng)需要生成標題列表時,人們的大腦中涌現(xiàn)的第一個想法往往是使用 Repeater。的確,Repeater 會使這一工作變得非常簡單。
- < asp:Repeater runat="server">
- < HeaderTemplate>
- < table>
- < /HeaderTemplate>
- < ItemTemplate>
- < tr>< td>
- < %# DataBinder.Eval(Container.DataItem, "Title") %>
- < hr>
- < %# DataBinder.Eval(Container.DataItem, "Abstract") %>
- < /td>< /tr>
- < /ItemTemplate>
- < FooterTemplate>
- < /table>
- < /FooterTemplate>
- < /asp:Repeater>
這段代碼有什么問題?或者更準確地說,這段代碼中有哪些可以改進的地方?
注:在 ASP.NET 2.0 中,您可以將 DataBinder.Eval(Container.DataItem, field) 替換為一個較短的表達式,該表達式受益于 Page 類上的一個新的公共方法 — Eval。這一新的表達式類似于 Eval(field)。在內(nèi)部,Eval 調(diào)用 DataBinder 類上的靜態(tài) Eval 方法,并且確定要使用的正確綁定上下文。
字段的名稱在 ASPX 頁中硬編碼??梢詫崿F(xiàn)可重用性,但只能通過剪切和粘貼實現(xiàn)。您所添加的用于使 Repeater 的行為更加豐富多彩的代碼越多,對該解決方案及其跨越頁和項目的可重用性的危害就越大。如果標題列表控件恰恰是您需要的東西,則請改而嘗試以下方法。
- public class HeadlineList : ListControl, IRepeatInfoUser
- {
- :
- }
ListControl 是列表控件的基類(它位于與 CheckBoxList、DropDownList 和類似控件相同的系列中);IRepeatInfoUser 是上述大多數(shù)控件加以實現(xiàn)以便用水平或垂直方式在列和行中呈現(xiàn)的幾乎不為人所知的界面。請注意,ListControl 和 IRepeatInfoUser 還存在于 ASP.NET 1.x 中,并且以幾乎與 2.0 相同的方式工作。
列表控件是圍繞一個要重復(fù)的控件生成的;該控件(或控件圖)是一個類屬性,并且在加載時實例化以節(jié)省一些 CPU 時間。以下為私有 ControlToRepeat 屬性的實現(xiàn)。
- private Label _controlToRepeat;
- private Label ControlToRepeat
- {
- get
- {
- if (_controlToRepeat == null)
- {
- _controlToRepeat = new Label();
- _controlToRepeat.EnableViewState = false;
- Controls.Add(_controlToRepeat);
- }
- return _controlToRepeat;
- }
- }
在該示例中,要重復(fù)的控件(標題)是一個在首次讀取時實例化的 Label。HeadlineList 控件還應(yīng)當(dāng)向用戶提供通過多種屬性(如 RepeatLayout、RepeatColumns 和 RepeatDirection)影響外觀的方式。很多標準列表控件上都定義了這些屬性,因此開發(fā)人員不應(yīng)該對它們感到陌生。它們的實現(xiàn)是類似的,并且看起來像下面的代碼。
- public virtual RepeatDirection RepeatDirection
- {
- get
- {
- object o = ViewState["RepeatDirection"];
- if (o != null)
- return (RepeatDirection) o;
- return RepeatDirection.Vertical;
- }
- set
- {
- ViewState["RepeatDirection"] = value;
- }
- }
為完成 HeadlineList 控件而需要編寫的另一段代碼以呈現(xiàn)為中心。IRepeatInfoUser 接口對您可以用來控制呈現(xiàn)過程的各種屬性進行計數(shù)。這方面的屬性示例有 HasHeader、HasFooter 和 HasSeparator 布爾型屬性。您可以像實現(xiàn)其他任何普通屬性一樣實現(xiàn)這些屬性,并且根據(jù)需要在 RenderItem 接口方法中使用它們。
- public void RenderItem(ListItemType itemType, int repeatIndex,
- RepeatInfo repeatInfo, HtmlTextWriter writer)
- {
- string format = "< b>{0}< /b>< hr style='solid 1px black'>{1}";
- Label lbl = ControlToRepeat;
- int i = repeatIndex;
- lbl.ID = i.ToString();
- string text = String.Format(format, Items[i].Text, Items[i].Value);
- lbl.Text = text;
- lbl.RenderControl(writer);
- }
RenderItem 對向頁提供的輸出承擔(dān)最終的責(zé)任。它獲得要重復(fù)的控件,并且將其呈現(xiàn)到標記中。RenderItem 是從 Render 中調(diào)用的。
- protected override void Render(HtmlTextWriter writer)
- {
- if (Items.Count >0)
- {
- RepeatInfo ri = new RepeatInfo();
- Style controlStyle = (base.ControlStyleCreated
- ? base.ControlStyle : null);
- ri.RepeatColumns = RepeatColumns;
- ri.RepeatDirection = RepeatDirection;
- ri.RepeatLayout = RepeatLayout;
- ri.RenderRepeater(writer, this, controlStyle, this);
- }
- }
RepeatInfo 是一個 Helper 對象,它經(jīng)過專門設(shè)計,以便通過重復(fù)現(xiàn)有的控件圖來生成新控件。以上就是所需的全部代碼。讓我們準備一個示例頁,并測試該控件。
- < expo:headlinelist id="HeadlineList1" runat="server"
- repeatlayout="Table" repeatdirection="Vertical" repeatcolumns="2"
- datatextfield="LastName" datavaluefield="Notes" />
圖 2 顯示了該控件的工作方式。
列表控件示例: HeadlineList 數(shù)據(jù)綁定控件
該控件在設(shè)計時工作正常,并且不需要插入其他任何代碼。然而,這段代碼的最令人愉快的邊界效應(yīng)并非免費的設(shè)計時支持。對我來說,它簡直太美妙了,因為它能夠使用 ADO.NET 數(shù)據(jù)源對象(例如,DataTable 或 DataSet)和數(shù)據(jù)源組件(如 SqlDataSource)。您可以取走這段代碼,將其編譯為 ASP.NET 1.x 項目,而它就可以使用基于 IEnumerable 的數(shù)據(jù)源。如果將這段代碼引入到 ASP.NET 2.0 項目中,則它無須更改就同樣可以使用數(shù)據(jù)源對象。
這一事實的意義是什么?
在 ASP.NET 1.x 中,ListControl 類是一個令人愉快的例外 — 但仍然是一個例外。在 ASP.NET 2.0 中,您可以使用類似的簡單但有效的方法來生成任何數(shù)據(jù)綁定控件。在這樣做的時候,您可以利用合并了大部分復(fù)雜性并且將大多數(shù)已知的最佳做法硬編碼的新基類。
【編輯推薦】
- ASP.NET 2.0數(shù)據(jù)綁定機制:生成控件
- ASP.NET 2.0數(shù)據(jù)綁定的發(fā)展簡述
- 概述ASP.NET調(diào)用Excel進程
- ASP.NET開發(fā)技巧之Theme功能淺析
- 詳解ASP.NET動態(tài)編譯
新聞名稱:列表控件示例:HeadlineList
文章出自:http://www.5511xx.com/article/djoejdj.html


咨詢
建站咨詢
