一个很笨的方法
procedure PubP_SetDatasetToEditStat(const D: TDataSet);
begin
if not (D.State in [dsEdit,dsInsert]) then D.Edit;
end;
//MoveType=0上移否则下移
//NoMoveField 不移动数据列表,比如:主键列
procedure PubP_DatasetRecordMove(T: TClientDataSet; MoveType: Integer;NoMoveField:string);
var
FValue1,FValue2:array of Variant;
i:integer;
s:string;
begin
if (not T.Active) or (T.IsEmpty) or (T.ReadOnly) then Exit;
if (MoveType=0) then begin
if T.recno=1 then Exit;
end;
if (MoveType=1) then begin
if T.RecNo=T.RecordCount then exit;
end;
T.DisableControls;
try
SetLength(FValue1,T.FieldCount);
SetLength(FValue2,T.FieldCount);
for i := 0 to T.FieldCount -1 do FValue1[i] := T.Fields[i].Value;
if MoveType=0 then T.Prior else t.Next;
for i := 0 to T.FieldCount -1 do FValue2[i] := T.Fields[i].Value;
PubP_SetDatasetToEditStat(T);
for I := 0 to T.FieldCount -1 do begin
s := T.Fields[i].FieldName;
if pos(s+',',NoMoveField)>0 then Continue;
T.Fields[i].Value := FValue1[i];
end;
if MoveType=0 then T.Next else t.Prior;
PubP_SetDatasetToEditStat(T);
for I := 0 to T.FieldCount -1 do begin
s := T.Fields[i].FieldName;
if pos(s+',',NoMoveField)>0 then Continue;
T.Fields[i].Value := FValue2[i];
end;
if MoveType=0 then T.Prior else t.Next;
finally
T.EnableControls;
end;
end;