2

C# 4.0 で記述された 2 つのフォームがあります。FormA には、DataAdapter と BindingSource を使用して MS SQL データベースに接続された DataGridView があります。グリッドにはチェックボックスがあります。ユーザーがチェックボックスをオンにすると、FormB が呼び出されます。FormB には「はい」/「いいえ」ボタンがあります。FormB からの DialogResult が「はい」の場合、ユーザーが FormA で追加の項目を押すことなく、データベースをチェックボックスの新しい値で更新する必要があります。

ここにいくつかの疑似コードがあります:

フォームA:

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (dataGridView1.IsCurrentCellDirty)
        {
            dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        DialogResult dialogRes = new FormB().ShowDialog();
        if (dialogRes == DialogResult.Yes)
        {
             dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
             dataGridView1.EndEdit();
             table.EndInit();
             dataAdapter.Update(table);
        }
    }

結果はデー​​タベースに保存されません。ボタンイベントに同じ「保存/更新」機能を配置すると、正常に機能します。したがって、変更を正常にコミットする前に、CellValueChanged イベントを完了する必要がある (そして、追加のイベントをトリガーする必要がある可能性があります) ためであるに違いありません!?

助けてください、気が狂いそうです...

編集: CellEndEdit を使用しても同じ効果があります。これはありません。SqlCommandBuilder をセットアップしました。データベースは、上記以外のすべての状況で正しく更新されています。

4

1 に答える 1

2

SQLコマンドビルダーのMSDNからこの例を見る必要があります。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx

アダプターが Update() メソッドを使用するには、タスクを実行するためのコマンドのセットアップが必要です。コマンドビルダーは、データを入力するときに、指定された Select コマンドからこれらのコマンドを生成するために使用されます:-

public static DataSet SelectSqlRows(string connectionString,
    string queryString, string tableName)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(queryString, connection);
        SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

        connection.Open();

        DataSet dataSet = new DataSet();
        adapter.Fill(dataSet, tableName);

        //code to modify data in DataSet here

        builder.GetUpdateCommand();

        //Without the SqlCommandBuilder this line would fail
        adapter.Update(dataSet, tableName);

        return dataSet;
    }
}
于 2012-12-11T13:46:56.540 に答える