cxGrid中某行向上/向下移动 本帖最后由 sibad_sh 于 2010-03-05 14:42:10 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先设置排序的字段为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 点击 "3 大华"这行的FocusedRecordIndex应该是1却是2, 点击 "2 小敏"这行的FocusedRecordIndex应该是2却仍是1 这个是正确的,因为你上面的代码操作的不是真正的数据集,而是一个数组中的值。每个单元格就是数组中的一个值,楼主用这种修改值的方式来操作,只是改了数组中的值,而没有修改到数据集中的内容。只有当单元格获得焦点被修改了值后,才会前后一起更改。看楼主的代码,基本思路已出来了。只要改一下操作的对象,将当前VIEW改成对应的数据集,再调试就差不多了。再提示一下:直接操作adodataset,并将adodataset1.LockType:=ltBatchOptimistic; 说到底就是交换排序值 tgbd: 你好!谢谢你的帮助,但是我还是有点不懂的地方。在点击“向下”的动作中我会修改数据集ADODataSet的值,上面过程中我没加进去,那样的话就会将上下两行ADODataSet对应的Sequence值被修改了,然后再刷新数据集,定位那肯定是没有问题的。但我希望做的是不用刷新定位,就能达到效果。所以才想仅仅控制cxGrid层面,而不是通过控制其数据集来达到目的。 不要刷新就已可以达到效果了,因为是在缓冲里面操作的,而且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;只有当点击保存按钮时,才提交到数据库中去。 如何通过SQL语句在access中动态创建查询对象? 如何修改网络连接中VPN属性里的IP地址?? 关于脚本引擎部分如何实现? delphi 怎么把类似‘Dětmarovice’的西文转化为‘Dětmarovice’这样的? ■■■■■为以前的情债而烦■■■■■ 有关怎么用mts/com+ 在线求助!!急!急!急!关于TQuery! 4行delphi程序 关与两个键盘按键消息之间的延时问题。 随着Kylix的推出是否意味着Delphi程序员的身价会大涨? 请问如何判断一个TForm对象是否已经存在? 关于Tstream的问题 form的简单问题
向下操作:
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
中的值,而没有修改到数据集中的内容。只有当单元格获得焦点被修改了值后,才会前后一起更改。看楼主的代码,基本思路已出来了。只要改一下操作的对象,将当前VIEW改成对应的数据集,再调试就差不多了。再提示一下:直接操作adodataset,并将adodataset1.LockType:=ltBatchOptimistic;
说到底就是交换排序值
假设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;只有当点击保存按钮时,才提交到数据库中去。