第16章 Windows Form與資料繫結 16-1 資料繫結的基礎 16-2 在專案新增資料來源 16-3 使用資料來源建立單筆編輯表單 16-4 設計階段的資料繫結 16-5 執行階段的資料繫結 16-6 資料顯示的DataGridView控制項
16-1 資料繫結的基礎 16-1-1 認識資料繫結 16-1-2 執行與設計階段的資料繫結
16-1-1 認識資料繫結 -說明 在Windows Form表單可以使用資料繫結(Data Binding)技術,將外部資料整合到控制項,輕鬆在表單顯示資料內容。 資料繫結(Data Binding)是一種.NET Framework提供的強大功能,屬於一種高擴充性、可重複使用和容易維護的技術,可以將外部資料整合到Windows Form控制項,如同建立一座雙向橋樑來連接控制項屬性和外部的資料來源。
16-1-1 認識資料繫結 - Windows Form與資料繫結 資料繫結與Windows Form表單擁有密切的關係,因為資料繫結技術可以將Windows Form表單的TextBox、ComboBox、ListBox和DataGridView等控制項屬性連接至外部資料來源的DataSet或DataView等ADO.NET物件,如下圖所示:
16-1-1 認識資料繫結 - Windows Form的資料提供者 Windows Form表單是使用.NET Framework的資料繫結技術將控制項屬性連接到外部的可用資料(Data),在此的可用資料可以是單純資料、物件屬性,控制項名稱的集合物件等,.NET Framework可以將資料視為類別的屬性來存取。 事實上,Windows Form的資料提供者可以是任何實作IList介面的物件(在.NET Framework 1.0和1.1版),例如:集合、陣列、DataSet、DataTable、DataView、DataColumn和DataViewManager等物件。 在.NET Framework 2.0版新增BindingSource物件,可以作為Windows Form資料提供者。
16-1-1 認識資料繫結 - 資料繫結的種類 在Windows Form表單使用的資料繫結技術可以分為兩種:簡單和複雜資料繫結。其說明如下所示: 簡單資料繫結(Simple Data Binding):控制項只能連接和顯示單一資料元素,即資料表單一記錄的指定欄位值,常用控制項有TextBox和Label控制項等。 複雜資料繫結(Complex Data Binding):複雜資料繫結也稱為「清單基礎資料繫結」(List-based Data Binding),可以連接超過一個以上資料元素的清單,以資料表來說就是多筆記錄,常用控制項有ComboBox、ListBox和DataGridView控制項等。
16-1-2 執行與設計階段的資料繫結- 設計階段的資料繫結(步驟) 設計階段的資料繫結是在Visual Studio建立應用程式時,就已經預先建立Windows Form控制項的資料繫結,其基本步驟如下所示: Step 1:使用Visual Studio的資料來源(Data Source)管理介面,即VS Express for Desktop的「資料來源」視窗和資料來源組態精靈建立資料來源,或在專案加入【資料集】項目,使用TableAdapter組態精靈來建立資料來源的DataSet物件。 Step 2:在「資料來源」和「屬性」視窗,拖拉項目或指定屬性值來建立資料繫結。
16-1-2 執行與設計階段的資料繫結- 設計階段的資料繫結(新增物件) 在Windows Form表單控制項使用資料來源建立資料繫結後,Visual Studio會自動在元件匣新增DataSet、BindingSource、TableAdapter和BindingNavigator等物件,如下圖所示:
16-1-2 執行與設計階段的資料繫結- 設計階段的資料繫結(物件說明) BindingSource物件:資料來源和控制項間的連接,它連接的是單一資料表的資料,即DataTable物件,簡單的說,透過它可以設定連接至DataSet物件的哪一個資料表,並且提供控制功能來移動、新增和刪除資料。 TableAdapter物件:其功能類似DataAdapter物件,可以支援資料來源的資料表來執行多次查詢。換句話說,單一TableAdapter物件,就可以更新DataSet物件中,多個資料表的記錄資料。 BindingNavigator物件:瀏覽資料來源DataSet物件的工具列控制項,提供按鈕來移至前一筆、下一筆、新增、編輯和刪除記錄資料。
16-1-2 執行與設計階段的資料繫結- 執行階段的資料繫結 執行階段的資料繫結是在執行Visual Basic應用程式時,使用程式碼建立資料來源的物件後,直接以程式碼指定控制項屬性來建立資料繫結,如下圖所示:
16-2 在專案新增資料來源-說明 Visual Studio提供資料來源(Data Source)管理介面,在VS Express for Desktop就是「資料來源」視窗和資料來源組態精靈,可以幫助我們快速建立資料繫結所需的資料來源。 在VS Express for Desktop可以使用資料來源組態精靈在專案新增資料庫、Web服務或物件的資料來源(Data Source),資料來源事實上就是「具型別DataSet」(Typed DataSet)的別名。
16-2 在專案新增資料來源- 具型別DataSet 具型別DataSet:實作的程式碼是繼承DataSet類別來實作資料表欄位與物件屬性間的對應,可以直接使用物件屬性來存取資料表欄位,因為物件屬性的型別就是對應資料表欄位的型別,在編譯前就已經知道欄位型別,所以稱為具型別DataSet。 不具型別DataSet:在第15章使用ADO.NET程式碼建立的DataSet物件是一種「不具型別DataSet」(Untyped DataSet),因為我們只能使用欄位名稱字串或原始順序值來存取欄位值,在編譯前並不知道欄位型別,所以稱為不具型別DataSet。
16-2 在專案新增資料來源-Visual Basic專案 Visual Basic專案:Ch16-2 在Visual Basic專案建立連接【選課系統.mdf】資料庫的資料來源,即新增名為【選課系統DataSet】的具型別DataSet物件,如右圖所示:
16-3 使用資料來源建立單筆編輯表單-說明 在「資料來源」視窗 展開資料表清單,按【教授】資料表後的向下箭頭,可以看到一個功能表,選【DataGridView】可以使用瀏覽方式來顯示記錄資料,並且自動建立資料繫結所需的相關物件,如果在資料表後選【詳細資料】,就可以拖拉建立單筆記錄編輯功能所需的控制項,如右圖所示:
16-3 使用資料來源建立單筆編輯表單- Visual Basic專案 Visual Basic專案:Ch16-3 在Windows應用程式已經建立第7-2節的資料來源後,我們就可以新增【課程】資料表的單筆編輯控制項,如下圖所示:
16-3 使用資料來源建立單筆編輯表單- 導覽工具列 在導覽工具列提供記錄編輯和相關按鈕來移動資料表的記錄資料,可以移至前一筆、下一筆、第1筆和最後1筆,如下圖所示:
16-3 使用資料來源建立單筆編輯表單- 自動建立的元件 當我們將資料來源的項目拖拉至表單後,VS Express for Desktop自動在表單下方的元件匣新增相關物件,如下圖所示:
16-3 使用資料來源建立單筆編輯表單- 自動建立的程式碼 請開啟程式碼編輯視窗,可以看到VS Express for Desktop自動產生的程式碼,如下圖所示:
16-3 使用資料來源建立單筆編輯表單-課程BindingNavigatorSaveItem_Click() 導覽工具列儲存按鈕的事件處理程序是使用TableAdapterManager物件的UpdateAll()方法來更新整個DataSet物件至資料來源,也就是將更改的記錄資料寫回資料庫,如下所示: Me.TableAdapterManager.UpdateAll( Me.選課系統DataSet) 上述TableAdapterManager物件的UpdateAll()方法可以同時更新DataSet物件的所有資料表,包含教授和課程資料表。
16-4 設計階段的資料繫結 16-4-1 TextBox與Label控制項的簡單資料繫結 16-4-2 ComboBox控制項的複雜資料繫結
16-4-1 TextBox與Label控制項的簡單資料繫結- 說明 TextBox或Label控制項輸入和顯示的都是單一值,所以可以使用簡單資料繫結(Simple Data Binding)來顯示或編輯資料表的指定欄位值。 在表單建立TextBox或Label控制項後,就可以在控制項的「屬性」視窗展開【(DataBindings)】屬性,指定【Text】屬性使用的資料來源BindingSource物件的屬性值,即可建立控制項的簡單資料繫結。
16-4-1 TextBox與Label控制項的簡單資料繫結-Visual Basic專案 Visual Basic專案:Ch16-4-1 在Windows應用程式加入【學生】資料表的資料來源後,就可以在TextBox和Label控制項建立簡單資料繫結,顯示學生姓名和生日欄位,如下圖所示:
16-4-2 ComboBox控制項的複雜資料繫結-說明 ComboBox控制項是使用複雜資料繫結(Complex Data Binding)來連接資料表中的多筆記錄,可以使用一筆記錄為一個項目來顯示多筆記錄資料。 ComboBox控制項最常使用在選取資料表的關聯欄位值,例如:建立使用【教授】資料表姓名和編號項目的ComboBox控制項後,就可以在【課程】資料表,使用此ComboBox控制項來選取關聯欄位【教授編號】的值。
16-4-2 ComboBox控制項的複雜資料繫結-屬性
16-4-2 ComboBox控制項的複雜資料繫結-建立 在VS Express for Desktop可以在「屬性」視窗,或開啟「ComboBox工作」功能表來指定屬性或欄位值。簡單的說,在ComboBox控制項的每一個清單項目都有兩個值,一是顯示給使用者選擇的DisplayMember欄位值;另一個是實際儲存的ValueMember欄位值。 至於如何將它對應到關聯欄位,就是使用SelectedValue屬性,它可以對應ComboBox控制項的ValueMember屬性的欄位。 在【課程】資料表的【教授編號】欄位就是SelectedValue屬性,其值是對應ValueMember欄位值,如此可以在ComboBox控制項顯示正確的【教授姓名】。
16-4-2 ComboBox控制項的複雜資料繫結-Visual Basic專案 Visual Basic專案:Ch16-4-2 在Windows應用程式建立【課程】資料表的編輯介面,這是使用複雜資料繫結來建立ComboBox控制項,可以選取關聯欄位的【教授編號】的值,如下圖所示:
16-5 執行階段的資料繫結-說明 執行階段的資料繫結如同設計階段,一樣可以建立簡單與複雜資料繫結,當我們在Visual Basic應用程式建立DataSet物件的資料來源後,就可以在指定控制項建立簡單與複雜資料繫結。
16-5 執行階段的資料繫結- 建立TextBox控制項的簡單資料繫結 當使用DataAdapter物件建立資料來源的DataSet物件objDataSet後,就可以在控制項屬性建立簡單資料繫結,首先使用控制項的DataBindings屬性取得控制項的ControlBindingsCollection集合物件,如下所示: txtNo.DataBindings.Add("Text", objDataSet.Tables("學生"), "學號")
16-5 執行階段的資料繫結- 建立複雜資料繫結的資料來源(說明) 對於控制項的複雜資料繫結,例如:ComboBox控制項,我們準備使用物件陣列建立ComboBox控制項的資料繫結,可以顯示項目清單的性別【男】和【女】,並且將項目的值繫結至DataSet物件的【性別】欄位。 首先需要建立ComboBox控制項的資料來源,可以是DataSet物件,以此例是使用物件陣列。
16-5 執行階段的資料繫結- 建立複雜資料繫結的資料來源(類別1) Class Gender Private _Name As String Private _Value As String Public Sub New(ByVal myName As String, ByVal myValue As String) _Name = myName _Value = myValue End Sub Property Name() As String Get Return _Name End Get Set(ByVal Value As String) _Name = Value End Set End Property
16-5 執行階段的資料繫結- 建立複雜資料繫結的資料來源(類別2) Property Value() As String Get Return _Value End Get Set(ByVal Value As String) _Value = Value End Set End Property End Class
16-5 執行階段的資料繫結- 建立複雜資料繫結的資料來源(物件陣列) 然後就可以建立性別的物件陣列,如下所示: Dim Genders() As Gender = { New Gender("男", "男"), New Gender("女", "女")} 上述程式碼建立2個元素的物件陣列,其Name和Value屬性值相同都是男和女。
16-5 執行階段的資料繫結- 建立ComboBox控制項的複雜資料繫結1 接著使用物件陣列作為資料來源,建立ComboBox控制項的資料繫結,因為是使用複雜資料繫結,所以需要指定DataSource、DisplayMember和ValueMember屬性,如下所示: cboGender.DataSource = Genders cboGender.DisplayMember = "Name" cboGender.ValueMember = "Value"
16-5 執行階段的資料繫結- 建立ComboBox控制項的複雜資料繫結2 ComboBox控制項會將選取項目的值寫入SelectedValue屬性值所繫結的欄位,我們可以使用簡單資料繫結來建立SelectedValue屬性所連接資料來源的成員,如下所示: cboGender.DataBindings.Add("SelectedValue", objDataSet.Tables("學生"), "性別")
16-5 執行階段的資料繫結-Visual Basic專案 Visual Basic專案:Ch16-5 在Windows應用程式使用執行階段資料繫結來建立【學生】資料表的單筆編輯介面,內含ListBox控制項選擇編輯的學生姓名,以ComboBox控制項選取性別,如下圖所示:
16-6 資料顯示的DataGridView控制項- 說明 DataGridView控制項可以顯示各種表格資料,以資料庫來說,就是顯示資料表的記錄資料,每一列是一筆記錄;每一欄對應資料表的一個欄位,上方擁有BindingNavigator導覽工具列可以提供完整記錄移動和編輯功能。 Visual Basic專案只需使用VS Express for Desktop加入資料來源的具型別DataSet物件,就可以使用資料繫結在設計階段直接拖拉資料來源的資料表圖示,即可建立DataGridView控制項。
16-6 資料顯示的DataGridView控制項- Visual Basic專案 Visual Basic專案:Ch16-6 在Windows應用程式使用設計階段的資料繫結,使用資料來源新增DataGridView控制項,以瀏覽方式顯示【教授】資料表的記錄資料,並且加入表單建立單筆編輯所需的控制項,如下圖所示:
End