了解使用XML為列表控件綁定數據的各種不同的方法
介紹
在web開發項目中我們需要經常寫一些代碼從數據源讀取動態數據到列表控件中在經典ASP時期這是一件相對比較困難的任務例如我們必須查詢數據庫找回 RecordSet 並且在手動創建HTML標簽時還要重述 RecordSet
現在在ASPNET中你做同樣的事情有了更好的辦法此外除了用數據庫作為數據源你還可以使用各種數據源比如XML文件哪一個更好呢?這會在性能適應性可靠性易配置性安全等方面引起爭論在這裡我不想討論這些
這篇文章討論了幾種可選擇的辦法給列表控件綁定不同類型的數據源(主要是XML文件)盡管我們使用ListBox 作為例子但你可以很容易地把這種技術擴展到其他從 SystemWebUIWebControlsListControl 類繼承而來的列表控件它們包括 CheckBoxList DropDownList 和 RadioButtonList
硬編碼列表框
作為開始讓我們回憶一下通常我們是怎樣用HTML定義一個列表框 (ListBox) 的下面展示了一個列表框的原始代碼這是最簡單的方法且費用最少但是缺少一些彈性來控制列表框的行為
<select size= id=lstPizzaTopping>
<option value=supreme>Supreme</option>
<option value=italianclassic>Italian Classic</option>
<option value=meatlover>Meat Lover</option>
</select>
在ASPNET中你可以使用列表框得到同樣的結果但是具有更多性能來控制它的行為和屬性
<asp:listbox rows= id=lstPizzaTopping runat=server>
<asp:listitem value=supreme>Supreme</asp:listitem>
<asp:listitem value=italianclassic>Italian Classic</asp:listitem>
<asp:listitem value=meatlover>Meat Lover</asp:listitem>
</asp:listbox>
讓我們在代碼中使用一點手法除了在列表框中硬編碼進去一些項你可以使用ListItem 對象生成一些項添加到列表框控件中ListItem 有兩個參數項的文字以及值如果你沒指定第二個參數那項的值將跟它的文字一樣下面的代碼演示了該怎麼做
<script runat=server>
Sub Page_Load(src as Object e as EventArgs)
lstPizzaToppingItemsAdd(new ListItem(Supreme supreme))
lstPizzaToppingItemsAdd(new ListItem(Italian Classic italianclassic))
lstPizzaToppingItemsAdd(new ListItem(Meat Lover meatlover))
</script>
<asp:listbox rows= id=lstPizzaTopping runat=server />
列表框綁定數據
事實上ASPNET允許你把列表框的內容跟對象綁定起來這個對象可以是一個數組一個集合對象一個數據庫甚至是一個XML文件下面的例子演示了怎麼把一個字符串數組綁定到列表框控件上我們將在後面更詳細地探究XML數據的綁定
<script runat=server>
Sub Page_Load(src as Object e as EventArgs)
Dim arrPizzaTopping as String() = _
{ Supreme Italian Classic Meat Lover }
lstPizzaToppingDataSource = arrPizzaTopping
lstPizzaToppingDataBind()
End Sub
</script>
<asp:listbox rows= id=lstPizzaTopping runat=server />
如果我們給數組添加一個新的元素會怎麼樣?列表框會反映出結果嗎?不會的除非你再一次使用 DataBind 方法利用這種數據綁定技術在什麼時候什麼地方更新列表框你擁有完全的控制權
讓我們看看另外一個例子在ASPNET中用 ArrayList 對象綁定數據這個 ArrayList 跟VB中的數組有點相似但是它功能更強它能支持更多復雜的數據類型ArrayList d實際上是一個集合所以我們可以把它作為一個集合添加一個新項我們調用 Add 方法並提供對象去 Add在這種情況下它是一個字符串
<script runat=server>
Sub Page_Load(src as Object e as EventArgs)
Dim arrPizzaTopping as new ArrayList()
arrPizzaToppingAdd(Supreme)
arrPizzaToppingAdd(Italian Classic)
arrPizzaToppingAdd(Meat Lover)
lstPizzaToppingDataSource = arrPizzaTopping
lstPizzaToppingDataBind()
End Sub
</script>
<asp:listbox rows= id=lstPizzaTopping runat=server />
數據綁定是把腳本跟用戶界面分離開來的一個例子(比如HTML代碼)但是像我們上面提到的數據綁定技術我們只能綁定靜態數據(這些數據應該被硬編碼進我們的aspx 文件) 如果數據是動態將會怎麼樣?如果我們想在其他頁面重用列表框又會怎麼樣?為了解決這些問題我們需要依賴於額外的數據源典型的我們使用數據庫把列表框中的內容存儲在表中有很多文章以及討論了這種技術舉例來說你可以查閱Scott Mitchell 關於用Access數據庫為列表控件綁定數據的文章
關於數據庫的講了很多現在我們試著使用一下另一種方法——XML文件XML文件是一個純文本文件所以你可以很容易地用記事本創建和編輯它下面的代碼塊是包含提供給列表框控件數據的XML文件的一個例子它有兩個部分這由注釋很清晰地標識出來第一部分包含了關於pizza toppings的列表第二部分包含了關於pizza crust的列表每一部分有多個條目在每一條目中又有 <value> 和 <desc> 兩個元素請記住這個XML文件只是一個例子你能定義你自己的元素和內容好像你已經餓了但是別抱怨我無論如何 pizza 和編程是非常匹配的
<?xml version= standalone=yes ?>
<lookup>
<! START OF: Topping >
<topping>
<value>supreme</value>
<desc>Supreme</desc>
</topping>
<topping>
<value>italianclassic</value>
<desc>Italian Classic</desc>
</topping>
<topping>
<value>meatlover</value>
<desc>Meat Lover</desc>
</topping>
<! END OF: Topping >
<! START OF: Crust >
<crust>
<value>original</value>
<desc>Original Crust</desc>
</crust>
<crust>
<value>handstretched</value>
<desc>HandStretched Crust</desc>
</crust>
<crust>
<value>pan</value>
<desc>Pan Crust</desc>
</crust>
<! END OF: Crust >
</lookup>
現在開始變魔術了在這個XML文件中沒有什麼特別的除非你把它加載到ADONET的DataSet中ADONET 強有力地支持XML它可以在XML文件上建立一個關系信息舉各例子提供前面提到的那個XML文件ADONET將自動創建一個名為lookup的DataSet它包含兩張表tooping和crust表tooping有兩列(value和desc)三行同樣的表crust也有(value和desc)三行ADONET是通過模式來讀和構造這些表的下面的圖形象的表示了DataSet 和它的 DataTable
為了把XML文家加載到DataSet 中你要使用下面的代碼第一行創建了一個新的 DataSet 實例 第二行調用了ReadXml 方法並把XML文件的完整路徑傳遞過去我們使用 ServerMapPath 把文件的虛擬路徑轉換成物理路徑
Dim myDataSet as DataSet = New DataSet
myDataSetReadXml(ServerMapPath(lookupxml))
把表綁定到列表框是簡單的我們僅僅設置一下列表框的DataSource 和 DataMember 屬性使其指向特定的表然後調用DataBind 方法就可以了別忘了設置 DataTextField 和 DataValueField 屬性它們顯示哪一列是作為值來使用哪一列是作為文本來使用因為ASPNET是不能自動決定的!
<script runat=server>
Sub Page_Load(src as Object e as EventArgs)
lstPizzaToppingDataSource = myDataSet
lstPizzaToppingDataMember = topping
lstPizzaToppingDataBind()
End Sub
</script>
<asp:listbox rows=
id=lstPizzaTopping
datatextfield=desc
datavaluefield=value
runat=server />
在列表框中排序
有時候你想要順序的排列你的項下面的代碼演示了這種情況第一行創建了一個表 topping的缺省視圖名為myDataView 的實例第二行把sort 屬性設置為desc ASC讓desc列中的數據升序排列下一行我們把列表框的 DataSource屬性設置為 myDatView然後調用 DataBind方法有效地傳遞列表框的內容
Dim myDataView as DataView = myDataSetTables(topping)DefaultView
myDataViewSort = desc ASC
lstPizzaToppingDataSource = myDataView
lstPizzaToppingDataBind()
性能問題
因為數據綁定是一個損耗資源的過程所以你應該只在你需要的時候綁定列表控件你應該在列表控件的內容是動態時或者在要故意重用列表控件時綁定數據後者比如同樣一個列表框在多個頁面顯示當你需要改變這些列表框的內容時你會節省很多時間因為你不需要一個個去修改如果沒有一個原因適合你為了避免不必要的開支你可以硬編碼列表控件的內容
在列表框中排列項也是需要耗費一定的資源如果你想要列表框在任何地方任何時間都是排列號的考慮用排列好的順序編寫XML文件而不是在編程時排列列表框中的項
結論
這篇文章介紹了在web頁面上處理列表控件的各種方式它從簡單易懂的硬編碼技術開始使用 arrayArrayList 綁定數據最後使用XML來綁定數據用XML綁定數據是一種你可以考慮代替數據庫的數據綁定方法它很容易實現而且能避免SQL數據庫給企業帶來的高額費用
From:http://tw.wingwit.com/Article/program/ASP/201311/21758.html