DataGridView控件可以和我们放在DataSet中的数据进行绑定,比如在DataSet的某一个DataTable中我们放置N行测试数据,然后和DataGridView控件dataGridView1进行绑定,那么当我们对某一行测试数据进行删除操作时,可以有两种思路:

              1、 通过dataGridView1的移除行操作来间接操作DataTable,然后通过DataAdapterDataTable中的数据覆写保存到数据库。

指令:

 
   
  1. dataGridView1.Rows.Remove(dataGridView1.CurrentRow); 

              2、 直接操作DataTable,删除选定的DataRow,从而刷新dataGridView1中的数据,然后通过DataAdapterDataTable中的数据覆写保存到数据库。

指令:

 
   
  1. form_DataSet.Tables["dvtest"].Rows.Remove(dr); 

   在执行后我们会发现,方法1成功更新了数据库,而方法2更新了dataGridView1的展示,却没有实现数据库中的更新。

 

   方法2启动调试,会发现:在使用DataAdapter对象的Update()方法时,并没有为DataTable生成对应的Command对象,所以DataAdapter对象并没有对数据库执行相应的操作

 

   那么为什么我们明明已经改变了DataTable对象,但CommandBuilder却没有生成相应的Command对象呢?原因在于:

 

   当我们执行方法1时,dataGridView1.Rows.Remove()方法并没有真正删除DataTable中对应的DataRow,而只是在对应的DataRow上放置了一个删除标记,在使用DataAdapter对象的Update()方法时,因为检测到这个标记,所以会生成相应的DeleteCommand对象,并跟据该行键值执行删除,从而成功覆写回数据库。

而在执行方法2时,DataTableRows属性执行Remove()方法,不会放置删除标记,而是直接从DataTable中删除该DataRow;在使用DataAdapter对象的Update()方法时,没有检测到删除标记,所以不会生成DeleteCommand对象,也就不会更新数据库中的相对应数据。