日期:2014-05-17  浏览次数:20777 次

dataGrapView的数据源关联dataset、dataTable、dataview的问题
已有一个dataset,数据源为一部分数据(数据库的一个查询结果)。显示采用的是dataGrapView。

现在要进行数据的删除操作,删除之后要对现有dataSet更新以保证显示数据的正确性,为提升性能,并未采用再次到数据库查询结果更新绑定的方法,而是用了
 ds.Tables[0].Rows[index].Delete(); //获取被选中行的首列内容 
 ds.Tables[0].AcceptChanges(); //更新DataSet改动
的方法,来实现数据集与数据库中的数据保持一致;到此步正确没有问题。

问题来了:
在此基础上,创建了一个dataView,来进一步筛选dataset的数据。
在筛选的基础上,重新进行删除操作,发现dataGrapView显示的数据与数据库中的不一致(就是说数据库的数据已经成功删除掉了,但是dataGrapView显示的数据却无变化。)

如何才能将在关联后的dataGrapView数据保持正确?

我的代码:
  ds.Tables[0].Rows[index].Delete(); //获取删除指定行
  ds.Tables[0].AcceptChanges(); //更新DataSet改动
  dv =ds.Tables[0].DefaultView; //dataview(查询筛选后的创建)
  dv.RowFilter = rowFilter; //筛选条件和排序
  dv.Sort = sort;
  dgvSongInfo.DataSource = dv;
明明用dv绑定更新后的dataset,为何dataGrapView还是显示未更新的数据?(就是数据库中已经删除的数据还在)


注意:开始时,dataGrapView关联的是dataset;查询结果后,关联的是dataview;


------解决方案--------------------
那样删除是可以的,但我不清楚你的rowFilter是怎么设置的,那个设置是允许将被删除的行显示出来。
另外如果你的DataTable不需要记录改动,你应该直接移除行而不是删除行,调用Remove方法直接移走。
再有就是不要绑定dv,而应该直接绑定DataTable,你可以做个实验,当绑定DataTable时,然后访问其DevaultView属性,得到DataView,然后设置其RowFilter属性,比如填写“1=2”,隐藏所有行,其结果将会反映到界面上,这说明界面上的控件实际上用的是DataView,而这样做的好处是,操作源数据方便。