已有一个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;

解决方案 »

  1.   

    这3个用起来都一样,最终那个DataGridView关联的都是DataView视图,另外你根本不必重新绑定数据源,除非你的数据源是重新从数据库中获取的。再有就是你根本不应该手动调用AcceptChanges,那个是非同步更新才需要用的。如果是直连数据库,并且要同步更新,那个AcceptChanges方法应该由da.Update方法替代,自动Accept。你的完整代码没看到,数据无变化本身就不清楚是指什么,因为正常的流程是,先在DataGridView里编辑修改,让DataGridView里面的数据变化,然后将此变化同步到数据库,因此你说的情况是根本不会出现的。
      

  2.   

    谢谢你的指点。就你的内容来说,你是建议我使用dataCommandBuilder实例化数据调配器,然后用.Update方法将DataGridView中的数据全部提交到数据库中,所以不会出现我所说的问题。
    我所说的问题,是指dataview所绑定的dateset已经改动,却显示没有改动的结果,这是我纳闷的地方。可以简单的这样理解为,操作删除成功某条数据库中的数据,但是却没有成功删除dataview所显示的某条数据。
    我的思路:
    数据库删除数据==》dateTable体现删除变化==》dataview绑定dateTable==》显示dataview顺便一问,请问用什么代码可以删除dataview所显示的某条数据?我用了dv.Table.row[index].delete()
    但是没有删除视图中的行
      

  3.   

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

  4.   

    按理说我使用的dataView是绑定修改过的table,怎么还会出现删除前的数据呢?
    我还是没弄明白。
    请问如果按照我的思路来,这里怎么修改比较好?直接用dataCommandBuilder?
    可是我没用哪个删除过数据
      

  5.   

    CommandBuilder不是用来删除数据的,它只是用来创建更新数据库用的SQL语句,代替手工写,不对DataTable的数据做任何改动(我也从来不用)
      

  6.   

    如果我要对dataGrapView中的数据进行删除,那么采用何种方式比较好?请教一下~