在用DataAdapter获得数据,填充到DataTable中后,再把DataGridView绑定到DataTable中后,我们可以在DataGridView进行增删改,然后可以调用DataAdapter的UpData(DataTable),来提交DataGridView中的更改。这个过程表面看来很自然,然后背后都有些什么东西呢?我们来看一下。
首先,DataGridView绑定到DataTable后,DataTable中的数据就和DataGridView中显示的数据成为一体,即DataGridView中变化,DataTable中也发生变化,随后调用UpData(DataTable),来完成了对DataTable中的更改数据向数据库提交,当然,如果DataAdapter的
deleteCommand,UpateCommand,InsertCommand没有语句的话,当然需要SqlCommandBuilder来自动生成语句来完成相应的对数据库的提交了。这些都很正常,其实换个控件来绑定一下,真正的问题就会显露出来,就是把一个简单控件绑定到DataTable上时的问题。
接下来我们通过
textBox1.DataBindings.Add("Text", DT,"学生编号"),这时如果更改textBox1的Text值,调用DataAdapter的UpData(DataTable),会发现数据库中的数据不发生改变,为什么呢?其实,DataAdapter的UpData(DataTable)方法在提交时会找DataTabel中有所改变的数据进行提交,当textBox1的数据库更改后,虽然DataTable中的数据也修改了,但DataTable中的所谓的标志没有改变,也就是当调用DataAdapter的UpData(DataTable)的方法时,不以为DataTable中有更改的数据,所以提交后,数据库中的数据不改变。这时,我们就想,DataTable中的数据明明改了呀,为什么那个所谓的标志没改呢?这里就是想,DataTable中的数据修改后,什么时间所谓本行更改标志才会变呢?经测试发现,只要把编辑的焦点移离本行数据就会触发修改本行的更改标志,这个标志可以通过调用本行的RowState来查看,查看本行是什么状态,没有修改的行是Unchanged这个关态,当然还有一些修改的状态,当然是与增删改有关的。现在的问题是,我们通过什么方法来修改这个状态呢,行的RowState是只读的,没法改变,现在办法就是当点击提交时,先移动行的焦点,再调用DataAdapter的UpData(DataTable)方法,可以通过 textBox1.BindingContext[DT].Position++来移动编辑焦点,这样就达到了更改本行状态的目的了,现在提交,数据库就可以修改了。