2012-09-22 132 views
2

我有一個從數據庫填充的DataGridView。 我有一個按鈕來保存從DGV到數據庫的更改,這工作正常。 但是現在我希望數據庫能夠在DGV中更改某些內容時自動更新。從DataGridView事件更新數據庫無法正常工作

我嘗試了幾個事件CellEndEdit,CellLeave,CellValidated,CellValueChanged和SelectionChanged。 如果我編輯了單元格內容並按回車或點擊/選擇了一個單元格上方或下方的單元格,這些更改已保存到數據庫中,但如果我在同一行中單擊或單擊/選擇了單元格旁邊的某個單元格,更改未保存。上述事件都沒有幫助我解決這個問題。

//編輯

一些示例代碼:

我填補我DGV這樣

query_em = "select * from Table;"; 
try 
{ 
    dt_em = new DataTable(); 
    da_em = new OleDbDataAdapter(query_em, connString); 
    cb_em = new OleDbCommandBuilder(da_em); 
    bs_em = new BindingSource(); 

    da_em.Fill(dt_em); 
    bs_em.DataSource = dt_em; 
    dgv_em.DataSource = bs_em; 
    dgv_em.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
    throw; 
} 

通常我用一個按鈕

private void bt_save_em_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      da_em.Update(dt_em); 
      MessageBox.Show("Database updated."); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      throw; 
     } 
    } 

更新他們,但我想有這樣的工作正常,但它沒有。上面描述了確切的問題。

private void dgv_em_SelectionChanged(object sender, EventArgs e) 
    { 
     da_em.Update(dt_em); 
    } 
+0

請我們看一些示例代碼,以便我們可以幫助 – Star

+0

添加一些代碼,我沒有看到這是如何幫助,但繼續;) 我需要另一個事件則上述。代碼是好的,到目前爲止,我認爲 – daydr3amer

回答

1

老問題,但我已經找到了一個解決方案,可以幫助一些人。 事實上,datagridview(讓我們稱之爲dgv,我是懶惰的^^)只有當你改變行(通過按回車,箭頭,點擊等)來驗證輸入並更新數據源。 所以要使用的事件是RowValidated。 但是,如果您在編輯後保留在同一行中,則此事件不會觸發,例如,如果您單擊同一行中的單元格。我foud解決強制驗證:使用另一個事件並調用this.validate(在VB me.validate

下面是一些VB示例代碼(如我以前說過,我懶得在C#轉換^^) ,我希望這將有助於:

Public Class Form1 
    Dim ValueChanged As Boolean 
    Dim da As MySqlDataAdapter 

    [...] 

Private Sub dgv_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellValueChanged 
    ValueChanged = True 
End Sub 

//not sure this one is still usefull, i'm still working on this stuff :) 
Private Sub dgv_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.RowValidated 
    If ValueChanged Then 
     ValueChanged = False 
     da.Update(dt) 
    End If 
End Sub 

Private Sub dgv_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgv.SelectionChanged 
    If ValueChanged Then 
     ValueChanged = False 
     Me.Validate() 
     da.Update(dt) 
    End If 
End Sub 
0

嘗試使用CellEndEdit:

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
     { 

try 
     { 
      da_em.Update(dt_em); 
      MessageBox.Show("Database updated."); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      throw; 
     } 

     } 
+0

,因爲我在我的問題中提到: * quote * 我嘗試了幾個事件CellEndEdit,CellLeave,CellValidated,CellValueChanged和SelectionChanged。 * /報價* – daydr3amer