0

現在、WPF で DataGrid を使用しています。CellEditEnding イベントで、DBConcurrencyException をキャッチします。これは、初めてうまくいきます。確認するには、プログラムをロードしてから、データベースのデータを変更します。次に、DataGrid のデータを変更すると、例外が発生します。catch 句で、テーブル データをリロードします。これまでのところすべて問題ありませんが、プロセスを繰り返すと、例外は発生しなくなりました。データをリロードするコードは次のとおりです。

    private void reloadData()
    {
        rebuildAdapter();
        tables[gridNumber] = new DataTable();
        adapters[gridNumber].Fill(tables[gridNumber]);
        grids[gridNumber].ItemsSource = tables[gridNumber].DefaultView;
    }

私は何が欠けていますか?

4

1 に答える 1

0

わかりました、今それを解決しました。DBConcurrencyException がスローされたときに、ブール値「isManualEditCommit」も再度 false に設定する必要があることを見落としていました。興味のある方は、以下のコードを参照してください。

private void grids_CellEditEnding(object sender, Microsoft.Windows.Controls.DataGridCellEditEndingEventArgs e)
{
    try
    {
        Microsoft.Windows.Controls.DataGrid grid = (Microsoft.Windows.Controls.DataGrid)sender;
        gridNumber = Convert.ToInt16(grid.Name.Substring(grid.Name.Length - 1, 1)) - 1;

        if (!isManualEditCommit)
        {
            isManualEditCommit = true;
            grid.CommitEdit(Microsoft.Windows.Controls.DataGridEditingUnit.Row, true);

            using (SqlConnection con = new SqlConnection(GUI.dictSettings["connectionString"]))
            {
                con.Open();

                SqlCommandBuilder com = new SqlCommandBuilder(adapters[gridNumber]);
                adapters[gridNumber].UpdateCommand = com.GetUpdateCommand();
                adapters[gridNumber].Update(tables[gridNumber]);

                tables[gridNumber].AcceptChanges();
                con.Close();
            }
            isManualEditCommit = false;
        }

    }
    catch (DBConcurrencyException ex)
    {
        isManualEditCommit = false;
        reloadData();

    } catch(Exception ex){
        isManualEditCommit = false;
        reloadData();
    }
}
于 2013-11-05T23:16:25.403 に答える