2

我有一个从数据库填充的 DataGridView。我有一个按钮可以将 DGV 中的更改保存到数据库中,这很好用。但是现在我希望数据库在 DGV 中的某些内容发生更改时自动更新。

我尝试了几个事件,如 CellEndEdit、CellLeave、CellValidated、CellValueChanged 和 SelectionChanged。如果我编辑单元格内容并按 Enter 或单击/选择其上方或下方的单元格工作正常,则更改将保存到数据库中,但如果我在同一行中按选项卡或单击/选择旁边的单元格,则更改未保存。上述事件都没有帮助我解决这个问题。

//编辑

一些示例代码:

我这样填写我的 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);
    }
4

2 回答 2

1

老问题,但我找到了可能对某些人有所帮助的解决方案。事实上,datagridview(让我们称之为 dgv,我很懒 ^^)验证输入并仅在您更改行时更新数据源(通过按 enter、箭头、单击等)所以要使用的事件是RowValidated. 但是如果您在编辑后停留在同一行中,则不会触发此事件,例如,如果您单击同一行中的单元格。我找到了强制验证的解决方案:使用另一个事件并调用this.validateme.validate在 vb 中)

这是一些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
于 2014-11-25T17:34:22.390 回答
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;
        }

        }
于 2012-09-23T12:10:17.590 回答