Windows Forms中的數據綁定
作者:劉志波
摘要:這篇文章是講解在Windows Forms中如何使用ADO.NET簡單的將Form和包含任何結構的數據綁定在一起。通過簡單或者復雜的數據綁定,把Form的control的屬性綁定到指定的數據上。 目標: 學習Microsoft.NET平臺中數據綁定的基礎知識 學習怎樣生成一個簡單的數據綁定form 學習如何往你生成的數據綁定form中添加ComboBox和ListBox Learn how to base data-bound forms on the results of parameterized queries. 學習如何綁定TextBox的數據 前提: 閱讀這篇文章應當了解一下內容: 理解關系數據庫以及知道如何訪問它 了解結構化查詢語言SQL 能夠訪問某一個數據庫服務,比如SQL Server或者是Access 內容: 數據綁定和Windows Form的基礎知識 生成簡單的數據綁定Windows Form 使用ComboBox和ListBox 使用TextBox的數據綁定 總結 A. 數據綁定和Windows Form的基礎知識 一般來講,數據綁定是指在運行時期自動設置一個或者多個控件的屬性從結構化的數據源自動獲得數據的過程。Windows Forms使用ADO.NET來實現數據綁定。使用數據綁定,就不再需要寫代碼來實現連接(Connection)和生成數據集了(DataSet),當然了在一個沒有綁定數據的form中,這些工作還是要自己手寫的。Microsoft.NET的wizard會為你生成必要的ADO.NET代碼,而不需要自己手寫。 Windows Form可以讓你輕松的綁定幾乎是包含數據的任何結構。這就意味著你可以幫定任何傳統的數據存儲,比如是存儲在Access或者SQL Server表中的數據,或者是從文件中讀取的數據,其他控件包含的數據,數組中的數據。數據是怎樣包含在結構中的對我們這篇文章來說并不重要。 在你把一個form綁定到數據上后,你就可以把form上的控件和指定的數據元素綁定起來。一般常用的數據綁定包括把TextBox的Text屬性和數據源的某列綁定起來。你同樣可以幫定控件的圖形屬性、背景圖屬性,或者是form上的任何控件的任何屬性。 Windows Form包括兩種形式的數據綁定:簡單型和復雜型。他們有各自的優點。 簡單綁定允許你把一個控件綁定到單獨的數據元素上,這種綁定常用在把一個表中某列的值幫定到一個form的控件上。使用這種方式,一般是用在僅僅顯示單個值的控件上。簡單綁定一般是綁定TextBox或者Label的數據。 復雜綁定允許你綁定多個數據元素,常用在把一個表中的多個列或者是多行幫定到控件上。支持復雜綁定的控件有:DataGrid、ComboBox、ListBox。 B. 生成簡單的數據綁定Windows Form .NET開發環境中使用的最基本的數據綁定用途是在一個DataGrid中顯示一個表的內容。下面的這個例子說明了幾個基本的步驟:(不包括細節) 1. 生成一個Windows Form 2. 在form中生成、配置一個DataSet 3. 在form中創建一個DataGrid,并且把他綁定到數據上 使用這個步驟形成的一個例子如圖1所示
圖1. 生成簡單的數據綁定Form的結果 生成示例Form 下面是創建示例Form的詳細步驟: 1. 點擊File,點擊New,然后點擊Project。接著會顯示New Project對話框。 2. 在對話框左邊的樹行圖中選擇Project Type。就這個例子而言,選擇Visual Basic Projects。 3. 在對話框右邊的模板列表中選擇Windows Application。 4. 填寫一個名稱,并且選擇你要保存的路徑。接著點擊OK來生成這個Project。 5. 按下F4來顯示這個form的屬性視圖。將form的Name屬性改為frmCustomers。 6. 將form的Text屬性改為Customer Information。 生成并且配置數據集(DataSet) 一旦你創建好project和form后,就可以創建和配置隱藏在form下的DataSet。一個DataSet是存儲在內存中的包含表、關系、約束的緩存。DataSet中的每一個Table都包含有Row和Column的一個集合。由于DataSet中記錄了數據的原始狀態和當前狀態,就可以跟蹤在數據上所做的任何操作。DataSet中的數據是可以被更新的。 數據綁定前要創建包含有SQL語句的DataAdaper。按照下面的步驟生成Connection和DataAdaper。 1. 在ToolBox的Data標簽上,選擇SqlDataAdaper,把他拖放到form中。接著會顯示Data Adapter Configuration Wizard。然后點擊Next。 2. 點擊New Connection來生成一個新的數據連接。接著會顯示如下圖2所示的Data Link Properties對話窗。
圖2. 使用Data Link Properties對話框指定連接信息 3. 將Server Name改為你要連接的數據庫的名字。在我們這個例子中,是(local)。 4. 將User Name、Password改為連接數據庫必要的驗證信息。 5. 選擇Northwind數據庫作為示例使用的數據庫。 6. 點擊OK返回到Wizard,然后點擊Next。 7. Wizard允許你指定Query Type,如下圖3所示。選擇Use SQL Statements,然后點擊Next。
圖3. 指定查詢類型 8. 輸入SQL查詢語句或者是點擊Query Builder來生成你所需要的查詢語句。在我們這個示例中,輸入如下的查詢語句: 9. select CustomerID, CompanyName, ContactName, ContactTitle, Country from Customers 10. 點擊Next,然后點擊Finish來完成這個過程。注意,向導已經為你生成了sqlConnection1和sqlDataAdatper1兩個對象。 sqlConnection1對象包括了怎樣連接數據庫的信息。sqlDataAdaper1對象包括了從數據庫中返回表和列的查詢信息。 注意:由于我們的示例使用的是SQL Server數據庫,因此使用了SqlDataAdapter,他僅僅用在訪問SQL Server數據庫上。如果你使用OLEDB連接其他類型的數據庫,你應該使用OleDbDataAdapter。 生成數據集對象(DataSet) 接著就是生成一個數據集對象(DataSet),這個DataSet使用的是剛才生成的DataAdapter的查詢語句。按照下面的步驟來生成一個DataSet: 1. 點擊Data,然后點擊Generate DataSet。接著會顯示如下圖4所示的Generate DataSet對話框。
圖4. Generate Dataset對話框指定對象名和其他的屬性 2. 輸入dsCustomers作為要生成的DataSet對象的名字。注意保證你選擇了Add this dataset to the designer選項。點擊OK。就這樣生成了所需要的DataSet。 這一步完成之后,你就可以在form的非可視控件區看到一個新的控件dsCustomers1。這個控件是文件dsCustomers.xsd的一個引用,我們可以在Solution Explorer窗口中看到這個文件。在這個XSD文件有一個不顯示的類文件,我們可以通過點擊Project菜單中的Show All Files來顯示這個文件。接著就可以點擊dsCustomers.xsd文件左邊的+號后看到這個類文件dsCustomers.vb,如下圖5所示。
圖5.XML schema definition (XSD)文件有一個類文件來把DataSet調入內存 dsCustomers.vb有對應到實際DataSet的屬性和對應到查詢語句中指定的每一列的屬性。雖然,我們并不需要對這個類文件做什么操作,不過了解它的存在是非常有用的。 添加一個DataGrid控件來顯示數據 現在可以生成一個form來顯示包含在DataSet中的數據了。在這個例子里,添加一個單獨的DataGrid控件到form中。這個DataGrid用來顯示包含在DataSet中的數據。按照下面的步驟開始: 1. 在窗口的頂端,點擊標簽來顯示frmCustomers form。 2. 點擊ToolBox標簽的Windows Forms,把一個DataGrid控件拖到form中來。調整DataGrid的Size屬性到一個適當的大小。 3. 按下F4來顯示這個DataGrid的屬性窗口。 4. 選擇DataSource屬性的值為dsCustomers1 5. 選擇DataMember屬性的值為Customers 這些步驟就完成了把一個DataGrid綁定到一個DataSet上。為了看到顯示的數據,還需要下面的一步工作。 把數據填到DataGrid控件上 雖然DataGrid控件已經綁定到了DataSet上,不過當form調入的時候,DataSet并不自動的把數據導出導DataGrid上。我們使用form的load事件在from調入的時候來填充DataGrid的數據。 Private Sub frmCustomers_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Load the Data Grid Control DsCustomers1.Clear() SqlDataAdapter1.Fill(DsCustomers1, "Customers") End Sub 在load事件中,首先清除dsCustomers1中的數據(Clear),然后用sqlDataAdapter1的Fill方法來填充dsCustomers1中的數據。在這里,要填寫第二個參數為表名,這個表名用于我們先前指定的DataGrid的DataMember屬性。 運行 現在就可以在DataGrid中看到顯示的Customers表中的數據了。在運行之前我們還要做一個工作。由于我們更改了form的Name屬性,因此要告訴Project從哪個form開始運行。 1. 在Solution Explorer窗口中,點擊項目名稱。 2. 右擊然后在快捷菜單中選擇Properties 3. 點擊Startup Object,然后從列表中選擇frmCustomers。 4. 點擊OK 5. 按下F5來運行程序。如果你所作的都正確的話,就可以看到如圖1顯示的DataGrid中的Customer表中的數據。 C. 使用ComboBox和ListBox 剛才的例子適合于小數據集,如果用在一個客戶表有成千上萬的資料的時候就不太合適了。問題就在于它把所有的客戶資料都讀取出來并且顯示在DataGrid上。作為例子可以采用,如果作為一個產品程序的話就不再合適了。 數據庫服務器對于讀取大量數據進行了優化,不過我們應當只讀取小數據集。如果我們在前面的例子中加上一個ComboBox來選擇國家并且只顯示這個國家的客戶的話,將會變得更加的有效。在這一節里,我們就這么做。下一節講怎樣使用ComboBox來限制顯示在DataGrid中的數據。我們按照下面的步驟來做: 1. 向form中添加第二個DataAdapter 2. 生成第二個DataSet 3. 向form中添加一個ComboBox 4. 把ComboBox綁定到剛才生成的DataSet上 5. 從DataAdapter中獲得要顯示在ComboBox中的數據 向form添加第二個DataAdapter 在使用ComboBox之前,先增加一個DataAdapter。并且使用這個DataAdapter來生成包含有不重復的國家列表的DataSet數據。添加DataAdapter按照下面步驟作: 1. 在Toolbox的Data標簽,選擇SqlDataAdapter,拖放到form中。接著就會顯示DataAdapter Configuration Wizard對話框。點擊Next。 2. 選擇連接到Northwind數據庫的連接。點擊Next 3. 選擇Use SQL Statements,點擊Next 4. 輸入下面的SQL語句: select distinct Country from Customers 5. 點擊對話框上的Advanced Options按鈕 6. 清除如下圖6所示的Generate Insert, Update, and Delete Statements選項。在我們使用ComboBox顯示國家的時候,這些語句用不上。點擊OK來關閉這個對話框。
圖6.不要選擇Generate Insert, Update and Delete Statement選項 7. 點擊Finish來生成DataAdapter 現在在form中就有一個名字為sqlDataAdapter2的對象了。 生成第二個DataSet 接著就來生成用于這個新DataAdapter的DataSet類和XSD文件。按照這些步驟作: 1. 點擊Data,然后電擊Generate DataSet。接著就顯示Generate DataSet對話框。 2. 保證選擇了列表框中的Customers(sqlDataAdapter2) 3. 點擊New,然后輸入名字dsCountries。保證選擇了Add this DataSet to the Designer選項。點擊OK。就生成了DataSet。 就這樣,添加了一個新的對象dsCountries和一個新的XSD文件dsCountries.xds。這兩項生成了DataSet類和接著就會用在ComboBox的數據綁定中。 添加ComboBox 現在可以添加ComboBox了,調整一下form的大小和DataGrid的大小來顯示這個ComboBox。接著,就可以從Toolbox中拖放一個ComboBox到form中,把他放在DataGrid的上面,就像下面的圖7那樣:
圖7. 包含有ComboBox和DataGrid的Form 把ComboBox綁定到DataAdapter上 剛才添加的ComboBox還沒有綁定到任何數據上。按照如下步驟把他綁定到dsCountries上: 1. 選擇這個ComboBox 2. 把Name屬性改為cboCountry 3. 設置DataSource屬性為dsCountries1。這樣就指定了他的數據源。 4. 把DropDownStyle屬性改為DropDownList。 5. 設置DisplayMember屬性為Customers.Country。點擊DisplayMember屬性的下拉列表,然后展開Customers來顯示可以使用的列。這個步驟就指定了要顯示的列。 6. 設置ValueMember屬性為Customers.Country。ValueMember屬性用在當選擇項時,實際使用的值。 導出數據到ComboBox 和使用DataGrid一樣,我們要手寫一些代碼來導出數據到ComboBox。在form的load事件中我們在原有的代碼后再添加如下的代碼: Private Sub frmCustomers_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Load the data grid control DsCustomers1.Clear() SqlDataAdapter1.Fill(DsCustomers1, "Customers") ' Load the Combo Box DsCountries1.Clear() SqlDataAdapter2.Fill(DsCountries1, "Customers") End Sub 用黑體顯示的代碼就是我們要添加的代碼。看上去,它和顯示DataGrid數據的代碼幾乎是一樣的。
|