2012-09-22 72 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