2013-11-01 54 views
0

我目前正在使用WPF中的DataGrid。在CellEditEnding事件中,捕获DBConcurrencyException - 第一次工作正常。要检查,我加载程序,然后更改数据库中的数据。接下来我更改DataGrid中的数据并激发异常。在catch子句中,我重新加载表数据。到目前为止,所有的事情都可以,但是当我重复这个过程时,这个例外不再被解雇。这里是我的代码重新加载数据:WPF DataGrid:DBConcurrencyException未捕获尝试catch

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

我错过了什么?

回答

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(); 
    } 
}