本帖最后由 sibad_sh 于 2010-03-05 14:42:10 编辑

解决方案 »

  1.   

    先设置排序的字段为sequence
    向下操作:
    procedure TForm1.Button1Click(Sender: TObject);  
    var
      SequenceIndex, RowIndex, Sequence: Integer;
    begin
      RowIndex := cxGridTBView1.DataController.FocusedRecordIndex; 
      SequenceIndex := cxGridTBView1.DataController.GetItemByFieldName('sequence').Index;  if RowIndex < cxGridTBView1.DataController.GetRecordCount then
      begin
        cxGridTBView1.BeginUpdate;
        Sequence := cxGridTBView1.ViewData.Records[RowIndex].Values[SequenceIndex];
        cxGridTBView1.ViewData.Records[Row].Values[SequenceIndex]   := Sequence+1;
        cxGridTBView1.ViewData.Records[Row+1].Values[SequenceIndex] := Sequence;
        cxGridTBView1.DataController.GetItemByFieldName('Sequence').SortOrder := soAscending;
        cxGridTBView1.EndUpdate;
        cxGridTBView1.Invalidate(True);
      end;
    end;
    但是发现这样的问题:
      点击cxGridTBView1后获取的cxGridTBView1.DataController.FocusedRecordIndex值错误了,如:
      开始时
          1  小王
          2  小敏(焦点)
          3  大华  
      之后
          1  小王
          3  大华  
          2  小敏(焦点)  点击 "3  大华"这行的FocusedRecordIndex应该是1却是2,
      点击 "2  小敏"这行的FocusedRecordIndex应该是2却仍是1
      

  2.   

    点击 "3 大华"这行的FocusedRecordIndex应该是1却是2, 点击 "2 小敏"这行的FocusedRecordIndex应该是2却仍是1  这个是正确的,因为你上面的代码操作的不是真正的数据集,而是一个数组中的值。每个单元格就是数组中的一个值,楼主用这种修改值的方式来操作,只是改了数组
    中的值,而没有修改到数据集中的内容。只有当单元格获得焦点被修改了值后,才会前后一起更改。看楼主的代码,基本思路已出来了。只要改一下操作的对象,将当前VIEW改成对应的数据集,再调试就差不多了。再提示一下:直接操作adodataset,并将adodataset1.LockType:=ltBatchOptimistic;
              说到底就是交换排序值
      

  3.   

    tgbd: 你好!谢谢你的帮助,但是我还是有点不懂的地方。在点击“向下”的动作中我会修改数据集ADODataSet的值,上面过程中我没加进去,那样的话就会将上下两行ADODataSet对应的Sequence值被修改了,然后再刷新数据集,定位那肯定是没有问题的。但我希望做的是不用刷新定位,就能达到效果。所以才想仅仅控制cxGrid层面,而不是通过控制其数据集来达到目的。
      

  4.   

    不要刷新就已可以达到效果了,因为是在缓冲里面操作的,而且CXGRID中列的排序属性会起效果的。
    假设cxgrid1中gr_Order绑定的是字段LOrder
       设置       gr_Order.SortOrder:=soAscending;
    那么,当点击上移、下移时,交换两记录的LOrder值
    例:
      cxgrid1.BeginUpdate;
      gr_Order.SortOrder:=soNone;
      with adodataset1 do begin
         ....   //写交换两值的代码
      end;
      cxgrid1.EndUpdate;
      gr_Order.SortOrder:=soAscending;只有当点击保存按钮时,才提交到数据库中去。