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.validate( me.validatevbで)呼び出します

ここにいくつかの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 に答える