怎样实现这样的功能:dataadapter-〉dataset-〉datagrid,当我选中datagrid中的某一条,点击按钮使其删除,但是不update dataadapter,只是在datagrid里面不显示此数据。当我删除多条以后,点击按钮保存,update 到 dataadapter里面去?
我在实现此功能的时候出现问题:我使用这样的语句来删除this.dataset11.Tables[0].Rows[this.dataGrid1.CurrentRowIndex].Delete();,但是当我第二次删除某条数据的时候,dataset里面数据表的row已经和datagrid的row错位了,也就是说,表单上显示的被选中数据,实际在datatable里面的row已经不是在datagrid里面的row了。简单地说,就是怎样能取得我在datagrid里面选中的数据在datatable里面的真实的row?

解决方案 »

  1.   

    没有同步删除的原因是在数据库中没有符合条件用来删除的记录:
     sqlDataAdapter1.DeleteCommand的命令字串及条件参数是自动生成的那种, 你检查一下参数值就知道了,原因可能是为DataColumn设置了表达式引起的.第二贴
      BindingManager  bindManager=dataGrid.BindingContext[dataSource,dataMember];
      bindManager.RemoveAt (bindManager.Position );  //永远只删除当前行
      

  2.   

    .dataset11.Tables[0].Rows[this.dataGrid1.CurrentRowIndex].Delete()是错的,表的行数不对应dataGrid的行数,试想父子表中,显示在DataGrid中的数据要看与父表匹配的记录有多少,而不能看子DataTable.Rows呀
      

  3.   

    问题出在这:dataset采用的是根据各行的RowState来进行数据更新的,而你用RemoveAT是将一个数据行物理删除出dataset中,所以,在更新时,dataset就没有这个行,也就不会针对这个行来更新数据源了。如果想更新的话,请用Delete()来为dataset中要删除的行,加上一个删除标志,这样的话就可以了
      

  4.   

    我也遇到dataset与数据库里边的数据同步的问题,好麻烦啊,帮你顶啊。
    locateangel:添加记录同步这个怎么处理你知道吗?有代码的话贴上来我学习以下啊
      

  5.   

    alias大虾,我用 BindingManager  bindManager=dataGrid.BindingContext[dataSource,dataMember];
      bindManager.RemoveAt (bindManager.Position );  这种方法,为什么每次删除的都是第一行?
      

  6.   

    到目前为止我还没有使用代码添加,我只是通过绑定后的datagrid来添加然后update,没有写任何的添加代码,不过删除必须要写了。
      

  7.   

    建议数据的新增\更改\删除等操作不要直接在DataSet的DataTable操作
    每个DataGrid最终都是绑定到DataView的,而这个DataView并不是固定的,当父表记录变化时,原DataView已DisiPose(),代之匹配父记录的新视图. 见到好些人从DataTable.DefaultVeiw去取这个视图,不出错才怪. 正解是不管父子表都从窗口的BindingContext取得BindingManagerBase, 使用EndCurrentEdit (),CancelCurrentEdit,RemoveAt,AddNew或Add,Position 等方法和属性来操作数据你可以用反射器找到:Related_CurrencyManager 类,有ParentManager_CurrentChanged事件的处理,并见有调用其基类CurrencyManager.SetDataSourc函数证明里面使list=null,和去掉了ListChanged 事件,所以,如果关系中的子表绑定经理不随父表当前行的变化而刷新的话,会出现 ListChanged事件失效等等问题.
      

  8.   

    alias88()
             能不能贴出完整的代码啊,