DataGridView控件可以和我們放在DataSet中的數據進行綁定,比如在DataSet的某一個DataTable中我們放置N行測試數據,然後和DataGridView控件dataGridView1進行綁定,那麼當我們對某一行測試數據進行刪除操作時,可以有兩種思路:
1、 通過dataGridView1的移除行操作來間接操作DataTable,然後通過DataAdapter將DataTable中的數據覆寫保存到數據庫。
指令:
- dataGridView1.Rows.Remove(dataGridView1.CurrentRow);
2、 直接操作DataTable,刪除選定的DataRow,從而刷新dataGridView1中的數據,然後通過DataAdapter將DataTable中的數據覆寫保存到數據庫。
指令:
- 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時,DataTable的Rows屬性執行Remove()方法,不會放置刪除標記,而是直接從DataTable中刪除該DataRow;在使用DataAdapter對象的Update()方法時,沒有檢測到刪除標記,所以不會生成DeleteCommand對象,也就不會更新數據庫中的相對應數據。