使用BindingSource連接資料庫-PART 2

摘要:使用BindingSource連接資料庫-PART 2在上一篇筆者簡單的介紹了如何利用BindingSource來連接資料庫,但是BindingNavigator的部分以及COmbobox沒有用到哩,這一篇筆者繼續介紹下去

上一篇筆者簡單的介紹了如何利用BindingSource來連接資料庫,但是BindingNavigator的部分以及COmbobox沒有用到哩,這一篇筆者繼續介紹下去
首先是BindingNavigator,拉出這個控制項之後,其實我們只要簡單的設定"BindingSource"的屬性之後,BindingNavigater便會自動設定與BindingSource的關連,也就會有導覽、新增、刪除的功能了,像是下面這張圖

就這麼簡單?沒錯,就是這麼簡單,但是下面這些屬性還是要稍微瞭解一下

  • AddNewItem
  • DeleteItem
  • CountItem
  • PositionItem
  • MoveFirstItem
  • MoveLastItem
  • MoveNextItem
  • MovePreviousItem

這 些屬性都是對應到一個ToolStripButton,所以說當我們不要它內建的功能的時候,把對應的屬性設定成"無"就可以了;以一個常見的例子來說, 設定好BindingNavigator的BindingSource後,執行程式並新增一些資料,然後按下刪除鍵,按刪除的時候系統不會跳出警告訊息說 資料即將被刪除,而這時候直覺想到的就是在刪除按鈕的Click事件裡面寫入相關的警告訊息,但是這樣子做了之後,不管使用者選擇刪除或是不刪除最後資料 還是會被刪掉,怎麼辦呢?這時候就要把DeleteItem屬性設定成無,之後用下面的程式碼來取代原先預設的動作
  1. Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click  
  2.         If MessageBox.Show("確定刪除""警告", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then  
  3.             Me.BindingSource1.RemoveCurrent()  
  4.             ''下面可以自行加入是否要儲存的程式碼  
  5.         End If  
  6.     End Sub  
Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click
        If MessageBox.Show("確定刪除", "警告", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
            Me.BindingSource1.RemoveCurrent()
            ''下面可以自行加入是否要儲存的程式碼
        End If
    End Sub

另外由於Navigator內建沒有儲存的功能,所以我們自行拉出一個按鈕來作儲存的功能,像是下圖這樣

新增了按鈕(ToolStriptButton)之後,下面這些是常用的屬性,可以試試看他的效果
  • Text
  • ToolTipText
  • Image
  • DisplayStyle

儲存的程式碼會長成這個樣子
  1. Private Sub btnSave_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnSave.Click  
  2.         Me.BindingSource1.EndEdit()  
  3.         Me.PeopleTableAdapter.Update(Me.MyDBDataSet.People)  
  4.         Me.MyDBDataSet.People.AcceptChanges()  
  5.         MessageBox.Show("儲存完成")  
  6.     End Sub  
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Me.BindingSource1.EndEdit()
        Me.PeopleTableAdapter.Update(Me.MyDBDataSet.People)
        Me.MyDBDataSet.People.AcceptChanges()
        MessageBox.Show("儲存完成")
    End Sub

其中為什麼要先呼叫EndEdit呢?主要是要結束編輯的狀態,如果沒有呼叫EndEdit的話你會發現如果編輯完成後把游標移動到其他的儲存格或是資料列,再去按儲存,這時候可以儲存成功;但是如果游標停留在同一個儲存格的話這時候去按儲存是會沒有效果的。
再 過來我們呼叫了PeopleTableAdapter的Update方法,這邊我們要簡單的說明一下DataSet;DataSet是屬於離線型的,也就 是當我們提取資料後他就不會持續跟資料庫保持連線中的狀態,而是會將資料提取到用戶端電腦的記憶體中,之後的操作便是針對記憶體中的資料去做操作,完成之 後在利用Adapter的Update功能一次將所有的資料Update回資料庫中。
再過來我們呼叫了AcceptChanges這個方法,那這個方法是在做什麼?這是由於在每個資料列中都有一個狀態的屬性(RowState),總共會有下面幾種
  • Added
  • Deleted
  • Detached
  • Modified
  • Unchanged

Update方法就是依照這些狀態去判斷要用什麼方式去對資料庫做更新的,而呼叫了AcceptChanges之後便會將狀態改為UnChangeed,也就是認可變更的意思。
大致上是這樣子,再過來就是要動手做了,馬上試試看吧。
下 面我們大致提一下Combobox的部分,有時候我們會用到像關連的東西,像是我們建立的測試資料庫中,部門資料表其中有ID跟名稱的部分,而每個人都有 各自所屬的部分,而對於使用者來說在設定的時候如果直接用ID讓哪做設定的話,使用者可能看不懂ID,或是說用ID來看比較沒有那麼直覺,那如果想要讓使 用者選擇的時候直接是看到名稱,那應該怎麼做呢?下面是屬性設定的擷取圖

使用資料繫結我們可以很簡單的達到這樣的功能,"選取的值"設定成BindingSource的人員資料表(People)的部門ID(pDepartment),這樣子使用者在選取的時候也對將對應的ID值填入People資料表中了。
利用BindingSource來連接資料庫大致上我們介紹到這邊,下一篇預計介紹一下xsd檔案的功用以及一些我們可以利用或是設定的部分。
如果您需要目前為止的範例檔案可以從這邊下載