DBGrid移动记录的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 johnkan
  • 开始时间 开始时间
J

johnkan

Unregistered / Unconfirmed
GUEST, unregistred user!
请问要移动DBGrid里的一行记录,按键上下移动的那种,请问怎样写代码,我写的老是出错。
 
在keypress事件
if key=#38 then
向上
if key=#40 then
向下
form的keypreview属性设置为true
 
不用写代码,DBGrid 本身就支持。
 
DBGrid已自带此功能!
 
同意lifangchao2008. 在dbgrid属于中有个option项,LZ可以看看
 
要想将一行数据搬来搬去,DBGrid 肯定没有这种功能,就是许许多多老外的表格都没有。
 
可是可以的,不过SELECT 出来的记录不能太多,太多的话可能效果不好
偏方:
你在表里面加一个字段,用来记录行号,怎么增加这个行号有很多方法了,这个不说了,你应该知道
示范,将表数据搞成这个样子
行号 字段1 字段2
1 A 1
2 B 1
3 BB 1
4 BA 2
5 CC 2
然后在KeyDown事件中,不是KEYPRESS事件,最好做两个按钮一个上一个下
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var p,n,r:Integer;
//P表示上一行行号
//N表示下一行行号
//R表示当前行行号
begin
if Key=VK_DOWN
then begin
if ADOQuery1.RecNo=ADOQuery1.RecordCount then Exit;
r:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Next;
n:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=r;
ADOQuery1.Post;
ADOQuery1.Prior;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=n;
ADOQuery1.Post;
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery1.Locate('rno',r,[]);
end;

if Key=VK_UP
then begin
if ADOQuery1.RecNo=1 then Exit;
r:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Prior;
p:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=r;
ADOQuery1.Post;
ADOQuery1.Next;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=p;
ADOQuery1.Post;
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery1.Locate('rno',r,[]);
end;

end;
//SQL里面记得ORDER BY rno
 
后退
顶部