如果回到Visual Basic的時代,數據綁定(data binding)是一項被遺棄的笨拙編程技術。DAO過分簡單和速度緩慢的控件讓數據綁定得了個壞名聲,許多有經驗的開發人員根本就不是用它。當時很普遍的看法是:“真正的程序員不吃蛋奶餅,而他們肯定也不用數據綁定!”
但是有了.Net之後,許多東西都發生了改變,其中一個變化是在快速應用程序開發中用於數據源的綁定控件具有了高效率。事實上,.NET讓整個數據綁定的概念超越了原有簡單地把控件附加到數據表格上的概念。這種能力對ASP.Net的開發人員尤其有用,因為這就更多地把他們同應用程序數據訪問層的反復無常隔絕起來。
數據綁定101:DataSet
用最簡單的方式來看,數據綁定牽涉了將ASP.Net的Web控件,例如說ListBox,附加到包含一些數據庫數據的DataSet上。ListBox.DataSource屬性讓你指定控件要綁定的DataSet,而DataBind方法會真正地用數據來填充控件。由於DataSet可以包含多個字段,所以帶有單個數據列的控件(ListBox、DropDownList等等)都會公開DataTextField和DataKeyFIEld屬性,這樣你就能夠分別指定控件將要以文本形式顯示的字段名或者用於值的字段名。
Listing A包含了一個簡單的例子,它將ListBox綁定到Northwind示例數據庫的Categories表格上。在創建了DataSet之後,我用DataSource屬性將它綁定到ListBox1。然後把DataTextField屬性設置為CategoryName,後者是ListBox1應該顯示的字段(它會被用作SelectedItem.Text),把DataKeyFIEld屬性設置為CategoryId,這樣ListBox1就會把它用作鍵。(它會被返回為SelectedItem.Value.)。
數據綁定201:數組和集合
好,綁定到DataSet是小孩的把戲。但是如果你所要的數據不在數據庫裡,那又會怎麼樣呢?如果你想讓用戶能夠從對象數列裡進行選擇,那又會怎麼樣呢?當然,你能夠手動創建包含有數據的DataSet,但是這有點像要蓋一座大樓,而你所需要的其實是一個工具棚。如果你只需要直接綁定到數組上,這是不是會很好?
事實的確如此,你可以直接綁定到參照類型變量的數組,這正如Listing B。在本文裡,我有一個類——DataClass,它公開了兩個屬性,Description和ID。我可以創建一個DataClass對象的數組,並將它綁定到ListBox1,這和我在Listing A裡對DataSet所做的一樣:把DataTextField設置為Description(描述),把DataKeyFIEld設置為ID。
ASP.NET使用實時的Reflection API來檢查數組裡的對象並找到正確的屬性,它然後會把它們載入到ListBox1的ListItemCollection裡。要注意,ASP.Net會專門去尋找property的成員——公共變量或者函數方法在這裡都不起作用。
Listing C說明集合同樣能夠很好的工作,這其實並不會讓你以外,因為我敢肯定到現在這個時候,你應該已經非常了解.Net是如何使用IEnumerable and IEnumerator interfaces to iterate over collections的。如果你碰巧不知道我在說什麼,試著看看將ListBox1綁定到CollectionClass的Listing D,它通過實現Ienumerable和IEnumerator來獲得類似集合的迭代能力。
數據綁定301:DataGrid
對DataGrid和相關控件的數據綁定也是類似的,只不過你要處理的可能是控件裡一個以上的列——否則,為什麼要用DataGrid呢?DataGrid缺省的綁定行為相當智能:所有的列(在使用DataSet的情況下)或者公共屬性(在對其他對象的情況下)會被顯示出來。所以只設置DataSource屬性會給你一個函數數據綁定方格。
當然在有些情況下,你不想用DataGrid來為自己創建列。你可以取消缺省的列自動生成的行為,並把AutoGenerateColumns屬性設置為偽(false),這樣就能夠控制DataGrid的列的生成和綁定。然後你就可以使用Visual Studio .Net 的列屬性編輯器為格創建列,如圖 A所示,或者通過為DataGrid所應該包含的每個列創建一個System.Web.UI.WebControls.BoundColumn實例來實現這一點.
圖A
Visual Studio .Net提供了一個優秀的列屬性編輯器
Listing E重新編寫了Listing C裡集合綁定的例子,以此來操作DataGrid。我首先關閉了DataGrid1裡列自動生成的特性,然後創建了一個新的BoundColumn對象。通過使用DataFIEld屬性,我把列對象綁定到DataClass的Description屬性上,再把它添加到DataGrid1的列集合裡。
畢業典禮!
數據綁定不僅僅是快速應用程序開發的一個重要方法,它還有助於將你數據結構的細節對應用程序的表示層隱藏起來。但是通過同樣的機制來綁定數據庫和對象數據,微軟讓在應用程序裡使用數據綁定控件更加實用了。