我想说的把你的代码全删干净,一行不留。
然后直接拖动一个BindingSource控件到form里
然后把BindingSource的DataSource属性设置为你的dt
接着把dgv的Datasource 设置为BindingSource;剩下的事情,就要看你的态度了
如果你愿意让微软帮你自动完成,你可以继续拖动一个BindingNavigator到UI上,并且设置DataSouce为BindingSouce如果你更愿意自己完成,那么就自己放控制按钮好了。比如下移一行,Bindingsouce.movenext,移除当前行
BindingSource.RemoveCurrent 
这样你上面的界面功能基本都可以完成了
=====================================至于如何同步的数据库里面,这个首先取决与你最早和dt相关的适配器adapter是否设置了相关detelecommand,Updatecommand ,InsertCommand 语句,如果已经设置,那么不必你做啥操作了,微软会自动更新你的修改到数据里面如果你前面木有设置,则需订阅一下Bindingsouce的OnListChanged事件,在这个事件里获取相关操作状态和行信息,然后自己更新信息入库ps:其实这块的东西在msdn的事例和演练里面都有,具体去看
http://msdn.microsoft.com/zh-cn/library/h974h4y2(v=vs.90).aspx
不过是设计演练的东西,很多是依靠直接设定数据库连接方式完成,玩OO滴觉着不靠谱,所以木流行开。但是这不表明,俺们不能使用代码使用OO,去利用这些微软已经做好的玩意,更方便的实现俺要实现的功能

解决方案 »

  1.   

    wanghui0380 
    老大,你说的方法我试了,网上也有,不行的,干嘛要拖动BindingNavigator呢,BindingNavigator是数据的行一行一行的移动显示,而我的问题是在一个datagridview中上下移动行记录的相对位置啊。BindingNavigator并没有这个功能啊?
      

  2.   

    每次删除一条数据就手动执行以下delete语句,如果大量删除的话跟数据库的操作就太频繁了,这个方法我想过,但是我觉得应该有更简单的方法实现吧。微软不至于这么笨吧,留下这么一个bug
      

  3.   

    主要是数据没有接受对数据源更新的提交,当你使增 删 改后可以通过datatable的AcceptChanges()方法提交自上次调用AcceptChanges以来对该表进行的所有更改,也可以通过RejectChanges方法回滚操作。
      

  4.   

    Quote: 引用 楼主 ytcola 的回复:

    datagridview直接绑定datatable后。
    下面 datagridview用dgv代替,dgv允许自动新增行,即:dgv.AllowUserToAddRows=true,datatable用dt代替
    删除行按钮的代码:
    if (dgv.CurrentCellAddress.Y >= 0 && dgv.CurrentRow.IsNewRow == false)
                {
                    dgv.Rows.Remove(dgv.CurrentRow);
                }
    使用上面的代码,在dgv中就 真 删除了一行,同时这一行在dt中 假 删除了(只做了删除标记,而没有真的删除),dgv中的行索引和dt中的行索引就不一致了。
    如果这个时候使用上下行移动代码:
    向上移动行代码:
    if (dgv.RowCount > 2 && dgv.CurrentRow.Index > 0 && dgv.CurrentRow.Index < dgv.RowCount - 1)
       {
         object[] _sourceRow = dt.Rows[dgv.CurrentRow.Index].ItemArray;
         object[] _destRow = dt.Rows[dgv.CurrentRow.Index - 1].ItemArray;
         dt.Rows[dgv.CurrentRow.Index].ItemArray = _destRow;
         dt.Rows[dgv.CurrentRow.Index - 1].ItemArray = _sourceRow;
         dgv.ClearSelection();
         dgv.CurrentCell = dgv.Rows[dgv.CurrentRow.Index - 1].Cells[0];
       }
    向下移动代码
    if (dgv.RowCount > 2 && dgv.CurrentRow.Index >=0 && dgv.CurrentRow.Index < dgv.RowCount - 2)
       {
         object[] _sourceRow = dt.Rows[dgv.CurrentRow.Index].ItemArray;
         object[] _destRow = dt.Rows[dgv.CurrentRow.Index + 1].ItemArray;
         dt.Rows[dgv.CurrentRow.Index].ItemArray = _destRow;
         dt.Rows[dgv.CurrentRow.Index + 1].ItemArray = _sourceRow;
         dgv.ClearSelection();
         dgv.CurrentCell = dgv.Rows[dgv.CurrentRow.Index + 1].Cells[0];
       }
    如果没有删除行的存在,以上代码运绝对没有任何问题,但是在dgv中删除行后,因为行索引不一致了,所以quote]每次都需要重新绑定数据源,记住一定要给每个字段做绑定的定义,不然就会移动变位了,
      

  5.   

    楼主可以试试用DataView的RowStateFilter将已删除的行过滤掉,应该就可以对应上了。
      

  6.   

    我删除的时候是在在dt中删除 然后重新绑定一下,不然dgv和dt的行数对应不起来