DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 使用XML為列表控件綁定數據
使用XML為列表控件綁定數據
編輯:XML詳解     

介紹

  在web開發項目中,我們需要經常寫一些代碼從數據源讀取動態數據到列表控件中。在經典ASP時期,這是一件相對比較困難的任務。例如,我們必須查詢數據庫,找回 RecordSet 並且在手動創建Html標簽時還要重述RecordSet。

  現在在ASP.Net中,你做同樣的事情有了更好的辦法。此外,除了用數據庫作為數據源,你還可以使用各種數據源,比如XML文件。哪一個更好呢?這會在性能、適應性、可靠性、易配置性、安全等方面引起爭論。在這裡,我不想討論這些。

  這篇文章討論了幾種可選擇的辦法了解使用XML為列表控件綁定數據的各種不同的方法。盡管我們使用ListBox 作為例子,但你可以很容易地把這種技術擴展到其他從 System.Web.UI.WebControls.ListControl 類繼承而來的列表控件。它們包括CheckBoxList、 DropDownList 和 RadioButtonList。

  硬編碼列表框

  作為開始,讓我們回憶一下通常我們是怎樣用Html定義一個列表框 (ListBox)的。下面展示了一個列表框的原始代碼。這是最簡單的方法,且費用最少,但是缺少一些彈性來控制列表框的行為。

<select size="1" id="lstPizzaTopping">
<option value="supreme">Supreme</option>
<option value="italianclassic">Italian Classic</option>
<option value="meatlover">Meat Lover</option>
</select>

  在ASP.Net中,你可以使用列表框得到同樣的結果,但是具有更多性能來控制它的行為和屬性。

<ASP:listbox rows="1" 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)
lstPizzaTopping.Items.Add(new ListItem("Supreme", "supreme"))
lstPizzaTopping.Items.Add(new ListItem("Italian Classic", "italianclassic"))
lstPizzaTopping.Items.Add(new ListItem("Meat Lover", "meatlover"))
</script>
...
...
<ASP:listbox rows="1" id="lstPizzaTopping" runat="server" />

  列表框綁定數據

  事實上,ASP.Net允許你把列表框的內容跟對象綁定起來。這個對象可以是一個數組,一個集合對象,一個數據庫甚至是一個XML文件。下面的例子演示了怎麼把一個字符串數組綁定到列表框控件上。我們將在後面更詳細地探究XML數據的綁定。

<script runat="server">
Sub Page_Load(src as Object, e as EventArgs)
Dim arrPizzaTopping as String() = _
{ "Supreme", "Italian Classic", "Meat Lover" }
lstPizzaTopping.DataSource = arrPizzaTopping
lstPizzaTopping.DataBind()
End Sub
</script>
...
...
<ASP:listbox rows="1" id="lstPizzaTopping" runat="server" />

  如果我們給數組添加一個新的元素會怎麼樣?列表框會反映出結果嗎?不會的,除非你再一次使用 DataBind 方法。利用這種數據綁定技術,在什麼時候什麼地方更新列表框,你擁有完全的控制權。

讓我們看看另外一個例子,在ASP.Net中用 ArrayList 對象綁定數據。這個 ArrayList 跟VB中的數組有點相似,但是它功能更強,它能支持更多復雜的數據類型。ArrayList d實際上是一個集合,所以我們可以把它作為一個集合。添加一個新項,我們調用 Add 方法並提供對象去 Add,在這種情況下它是一個字符串。

<script runat="server">
Sub Page_Load(src as Object, e as EventArgs)
Dim arrPizzaTopping as new ArrayList()
arrPizzaTopping.Add("Supreme")
arrPizzaTopping.Add("Italian Classic")
arrPizzaTopping.Add("Meat Lover")
lstPizzaTopping.DataSource = arrPizzaTopping
lstPizzaTopping.DataBind()
End Sub
</script>
...
...
<ASP:listbox rows="1" id="lstPizzaTopping" runat="server" />

  數據綁定是把腳本跟用戶界面分離開來的一個例子(比如Html代碼)。但是像我們上面提到的數據綁定技術,我們只能綁定靜態數據(這些數據應該被硬編碼進我們的ASPx 文件)。 如果數據是動態將會怎麼樣?如果我們想在其他頁面重用列表框,又會怎麼樣?為了解決這些問題,我們需要依賴於額外的數據源。典型的,我們使用數據庫把列表框中的內容存儲在表中。有很多文章以及討論了這種技術。舉例來說,你可以查閱Scott Mitchell 關於用Access數據庫為列表控件綁定數據的文章。

  關於數據庫的講了很多,現在我們試著使用一下另一種方法——XML文件。XML文件是一個純文本文件,所以你可以很容易地用記事本創建和編輯它。下面的代碼塊是包含提供給列表框控件數據的XML文件的一個例子。它有兩個部分,這由注釋很清晰地標識出來。第一部分包含了關於"pizza toppings"的列表,第二部分包含了關於"pizza crust"的列表。每一部分有多個條目,在每一條目中又有 <value> 和 <desc> 兩個元素。請記住,這個XML文件只是一個例子。你能定義你自己的元素和內容。好像你已經餓了,但是別抱怨我。無論如何,pizza 和編程是非常匹配的。


 

<?XML version="1.0" 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>Hand-Stretched Crust</desc>
</crust>
<crust>
<value>pan</value>
<desc>Pan Crust</desc>
</crust>
<!-- END OF: Crust -->
</lookup>

  現在開始變魔術了。在這個XML文件中沒有什麼特別的,除非你把它加載到ADO.NET的DataSet中。ADO.NET 強有力地支持XML,它可以在XML文件上建立一個關系信息。舉各例子,提供前面提到的那個XML文件,ADO.NET將自動創建一個名為lookup的DataSet,它包含兩張表:tooping和crust。表tooping有兩列(value和desc)三行。同樣的,表crust也有(value和desc)三行。ADO.Net是通過模式來讀和構造這些表的。下面的圖形象的表示了DataSet 和它的 DataTable。

 為了把XML文家加載到DataSet 中,你要使用下面的代碼。第一行創建了一個新的 DataSet 實例。 第二行調用了ReadXml 方法並把XML文件的完整路徑傳遞過去。我們使用 Server.MapPath 把文件的虛擬路徑轉換成物理路徑。

Dim myDataSet as DataSet = New DataSet
myDataSet.ReadXml(Server.MapPath("lookup.XML"))

  把表綁定到列表框是簡單的。我們僅僅設置一下列表框的DataSource 和 DataMember 屬性,使其指向特定的表,然後調用DataBind 方法就可以了。別忘了設置 DataTextField 和 DataValueFIEld 屬性,它們顯示哪一列是作為值來使用,哪一列是作為文本來使用,因為ASP.Net是不能自動決定的!

<script runat="server">
Sub Page_Load(src as Object, e as EventArgs)
...
...
lstPizzaTopping.DataSource = myDataSet
lstPizzaTopping.DataMember = "topping"
lstPizzaTopping.DataBind()
End Sub
</script>
...
...
<ASP:listbox rows="1"
id="lstPizzaTopping"
datatextfIEld="desc"
datavaluefIEld="value"
runat="server" />

  在列表框中排序

  有時候,你想要順序的排列你的項。下面的代碼演示了這種情況。第一行創建了一個表 topping的缺省視圖,名為myDataView 的實例。第二行把sort 屬性設置為desc ASC,讓desc列中的數據升序排列。下一行,我們把列表框的 DataSource屬性設置為 myDatVIEw,然後調用 DataBind方法有效地傳遞列表框的內容。

Dim myDataView as DataView = myDataSet.Tables("topping").DefaultVIEw
myDataVIEw.Sort = "desc ASC"
lstPizzaTopping.DataSource = myDataVIEw
lstPizzaTopping.DataBind()

  性能問題

  因為數據綁定是一個損耗資源的過程,所以你應該只在你需要的時候綁定列表控件。你應該在列表控件的內容是動態時,或者在要故意重用列表控件時綁定數據。後者比如同樣一個列表框在多個頁面顯示。當你需要改變這些列表框的內容時,你會節省很多時間,因為你不需要一個個去修改。如果沒有一個原因適合你,為了避免不必要的開支,你可以硬編碼列表控件的內容。

  在列表框中排列項也是需要耗費一定的資源。如果你想要列表框在任何地方任何時間都是排列號的,考慮用排列好的順序編寫XML文件,而不是在編程時排列列表框中的項。

  結論

  這篇文章介紹了在web頁面上處理列表控件的各種方式。它從簡單易懂的硬編碼技術開始,使用array、ArrayList 綁定數據,最後使用XML來綁定數據。用XML綁定數據是一種你可以考慮代替數據庫的數據綁定方法。它很容易實現,而且能避免SQL數據庫給企業帶來的高額費用。


 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved