CurrencyManager manager = (CurrencyManager)this.BindingContext[this.tDataGridView1.DataSource, this.tDataGridView1.DataMember];
                    int pos = manager.Position;//取鼠标所在行的位置
                    manager.AddNew();//新增一行
                    System.Collections.IList lis = manager.List;
                    DataView dv = (DataView)manager.List;//取出DataView 
                    int positm = TConvert.ToInt32(dv[pos][1]);
                    for (int i = dv.Count - 2; i >= pos; i--)//要插入行后面的行ITM全部加1,dv[i][1]是行的ITM字段
                    {
                        if (i >= pos)
                        {
                            dv[i][1] = TConvert.ToInt32(dv[i][1]) + 1;
                        }
                    }
                    dv[dv.Count - 1][1] = positm;//新增行设国鼠标位置行
                    tDataGridView1.Sort(tDataGridView1.Columns["ITM"], ListSortDirection.Ascending);//按ITM排序场境:一个表单的表身,双主键,bil_no,itm,同一张表,bil_no相同,不用管,ITM作排序字段,表单加载时按ITM排序,客户可能做完一张表单,保存了,发现漏了一行,要在中间加入一行。
例 bil_no itm  text.....
   123     0   0
   123     1   1
   123     2   2
   123     3   3
现在要在1前面插入一行
上面的代码可以实现
bil_no itm  text....
123     0   0
123     1   4
123     2   1
123     3   2
123     4   3
新增情况下完全没问题,但是如果是之前保存过了,再修改的时候插入,就会产生主键冲突
比如123 1 4 这个数据是新增行,肯定就和数据库里123   1   1产生冲突了(ITM主键),
123     2   1这个数据是修改行,也和123     2   2这条数据产生冲突
想不到其他解决方案,求各路高手指点

解决方案 »

  1.   

    更新的时候,先判断这条数据在数据库中是否存在(主key是否冲突),存在就update,不存在insert
      

  2.   

    应该分清楚什么事insert,什么是Update
      

  3.   

    从你的需求看,基本漏了一条的话,下面的所有数据都是错的,最简单的方法就是把错的全部Delete,然后再Insert;如果你想用Update的话,就在更新每条数据的时候判断(ITM主键)是否以存在。
      

  4.   

    源程序执行的insert方法,重新调用一下,再改一下sql语句不行么,操作数据库应该不算底层吧
      

  5.   

    先在DataView 查询下 bil_no itm  是否重复,重复就更新下 text 然后保存,不重复的insert,然后重新查询下,可以解决排序的问题