2016-11-10 60 views
0

我想在我的WPF表單上放置幾個按鈕,並用每個按鈕的不同數據庫中的數據動態更新我的DataGrid,假設我有3個數據庫和3個按鈕,一個按鈕可以從1個不同的數據庫中獲取數據。更新動態鏈接到DataGrid的數據庫

但是我希望DataGrid上的數據在網格上發生更改時更新回數據庫,因此我不必編寫所有「保存」內容。

眼下,代碼,我是這樣的:

try 
     { 
      OleDbConnection conn = new OleDbConnection(
       "Provider=Microsoft.Jet.OLEDB.4.0; " + 
       "Data Source=MaterialDB.mdb"); 
      OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM myTable", conn); 

      myDataSet = new DataSet(); 
      adapter.Fill(myDataSet, "myTable"); 

      var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty); 

      CatalogsGrid.DataContext = myDataSet; 
      CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView; 
      Binding nbe = new Binding(); 
      nbe.Source = myDataSet; 
      nbe.Mode = BindingMode.TwoWay; 
      nbe.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
      nbe.Path = new PropertyPath("myTable"); 
      nbe.BindsDirectlyToSource = true; 
      CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe); 


      CatalogsGrid.Items.Refresh(); 

     } 

此代碼從數據庫到電網中加載數據,但我編輯的數據,並沒有更新回的MS Access表。

哦,它仍然沒有編碼,但「myTable」應該是一個字符串,我把我想要顯示和更新網格的不同表的名稱。

我錯過了什麼?

+0

您可以在「雙向」模式下在WPF中進行綁定,在這種情況下,視圖可以更改綁定到的屬性。然後由您將其發送到數據庫。聽起來就像實體框架一樣! – SimoneF

回答

1

DataGrid不會自動保存更改,這取決於您(您的應用程序)的決定,但會將更改寫回基礎DataTable。

所以,據我所知,你想避免有一個保存按鈕,並保存更改後立即更改數據庫。你現在需要的是知道什麼時候事情已經改變,你的數據集可以幫你:

myDataSet = new DataSet(); 
myDataTable = myDataSet.Tables["myTable"]; 
adapter.Fill(myDataTable); 

// Update the DB whenever a row changes 
myDataTable.OnRowChanged += (s, e) => 
{ 
    adapter.Update(myDataTable); 
} 
+0

添加我的答案作爲評論,以此爲出發點解決問題。謝謝你的幫助 –

0

創建將更新用來將數據綁定數據的集中方法。創建一個保存按鈕並調用下面的函數。它將保存網絡流量以便在每次更改時保存數據。

public void UpdateDb (OleDbDataAdapter adap, DataSet ds) 
{ 
    var build= new OleDblCommandBuilder (adap); 
    adap.Update (ds); 
} 

只需要傳遞參數,它將更新對數據集所做的更改。

0

以@Bernhard答案爲起點,不得不添加更新命令和一些調整,現在它正在工作。

這是最後的代碼:

try 
     { 
      OleDbConnection conn = new OleDbConnection(
       "Provider=Microsoft.Jet.OLEDB.4.0; " + 
       "Data Source=MaterialDB.mdb"); 
      //conn.Open(); 
      OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM myTable", conn); 

      myDataSet = new DataSet(); 
      adapter.Fill(myDataSet, "myTable"); 
      DataTable myDataTable = myDataSet.Tables["myTable"]; 

      // Create the UpdateCommand. 
      OleDbCommand command = new OleDbCommand(
       "UPDATE myTable SET Type = @Type, Description = @Description " + 
       "WHERE ID = @ID", conn); 

      // Add the parameters for the UpdateCommand. 
      command.Parameters.Add("@Type", OleDbType.Char, 255, "Type"); 
      command.Parameters.Add("@Description", OleDbType.Char, 255, "Description"); 
      command.Parameters.Add("@ID", OleDbType.Integer, 5, "ID"); 
      adapter.UpdateCommand = command; 

      // Update the DB whenever a row changes 
      myDataTable.RowChanged += (s, f) => 
      { 
       adapter.Update(myDataTable); 
      }; 
      var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty); 

      CatalogsGrid.DataContext = myDataSet; 
      CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView; 
      Binding nbe = new Binding(); 
      nbe.Source = myDataSet; 
      nbe.Mode = BindingMode.TwoWay; 
      nbe.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
      nbe.Path = new PropertyPath("myTable"); 
      nbe.BindsDirectlyToSource = true; 
      CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe); 


      CatalogsGrid.Items.Refresh(); 

     } 

感謝您的幫助。