在DBgrid中,怎么样判断记录移动到上一行或者下一行?怎么样控制某一行在编辑的时候不能移动到其他行?

时间:2022-11-08 10:31:45
1,在DBgrid中,怎么样判断记录移动到上一行或者下一行?怎么样控制某一行在编辑的时候不能移动到其他行?
    2.在DBgrid中我用    
     DBGrid.SelectedRows.Delete;
     AdoCtmQry.UpdateBatch();
     删除选择的多条记录!当我选择记录的时候,我用上面的语句怎么删除不了当前的记录呢?
     我用:AdoCtmQry.delete;
          AdoCtmQry.post;也不行?是那里没有控制好呢?谢谢指点.....
      

14 个解决方案

#1


先占个1楼

#2


1.编辑时设DBGrid.Enabled := false;编辑完成再设其为true;
2.你试试行不:
  ...
  for i := 0 to DBGrid.SelectedRows.Count - 1 do
  begin
    AdoCtmQry.GotoBookmark(Pointer(DBGrid.SelectedRows[i]));
    AdoCtmQry.Delete;
  end;
  AdoCtmQry.UpdateBatch();

#3


1,在BeforeScroll事件中,记录当前记录
begin
  inherited;
  CBook:= CTable.GetBookmark;
end;
在 afterScroll事件中,记录当前记录
begin
  inherited;
  CBook与当前记录比较
end;
2,AdoCtmQry.delete;应该就删除了。

#4


1.编辑时设DBGrid.Enabled := false;编辑完成再设其为true;
 如果这样的话,我不是不能在DBGrid上修改数据?有没有办法提取DBgrid的行的索引值呢?


AdoCtmQry.delete;应该就删除了
   还是删除不掉;哪怕post 后也删除不掉;只有我选择记录后才行!

#5


问题2
procedure TForm1.Button4Click(Sender: TObject);
var i:Integer;
begin

  for i := 0 to DBGrid1.SelectedRows.Count - 1 do
  begin
    ADOQuery1.GotoBookmark(pointer(DBGrid1.SelectedRows[i]));
    ADOQuery1.Delete;
  end;
  dbgrid1.SelectedRows.Clear;
    //
end;

#6


问题1
procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
begin
  if true then
    abort;//不想post 时候使用,但是DBgrid1的多行选择时候生效的情况下不能阻止多行选择。
end;

#7


呵呵,我回答错了,那是我常用的方法,不在DBGrid中编辑;你试试这个:
这里设ADOQuery1为DBGrid1.DataSource.DataSet
procedure TForm1.DBGrid1StoreKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ADOQuery1.State = dsEdit then
    if Key in [38, 40] then Key := 0;
end;

#8


我没说清楚,不好意思,浪费大家时间了;我的意思是:
   我用以下的语句实现了在DBgrid中 DBGrid.SelectedRows.Delete;AdoCtmQry.UpdateBatch();删除选择的多条记录!(必须在选择的情况下)

  现在我只想删除DBGrid中当前的一条记录.我用AdoCtmQry.delete,为什么不行? 我设置了Dbgrid的Selectrows属性;我删除的记录是在没有选择的情况下,想删除当前指针默认的记录;
    简单点:就是怎么样判断DBgrid中没有记录被选中!
    
          

#9


to:  weizi2000(秋风啊-秋的叹息)
    我的修改不确定.我可以对DBgrid中的多条记录修改.因为我在keydown 和colexit中写了修改代码;当我离开的clounm时候自动修改值;这个时候当我换为其他行的时候,数据修改出现错误,(该修改的本行数据没修改,而是把当前焦点所在行的数据)

#10


在OnAfterInsert  OnAfterEdit事件中:
 DataSetName.Tag := 1;

在保存按钮事件中写:
 Try
   DataSetName.Tag := 0;  //不可少,否则永远都提交不了数据
   DataSetName.Post;
 Except
   DataSetName.Tag := 1
 End;

在DataSet.OnBeforePost事件中写:
  If DataSetName.tag=1 then Abort;


以上代码借用了DataSet.Tag作业互斥条件,因为移动记录的时候,如果数据集在编辑状态下会自动提交,而自动提交心然会调用BeforePost事件。

#11


简单点:就是怎么样判断DBgrid中没有记录被选中!

DBGrid1.SelectedRows.Count

#12


if DBGrid1.SelectedRows.Count>0 then //有记录选中

#13


TO:  kaguo(▲) Guozhi(★★★★★) 
    你的方法解决了我的删除问题;谢谢你;

  第一个问题我只要知道怎么捕捉到Dbgrid在不同的行就可以了;
  比如:我现在在修改第一行的数据,
       接着我又跳到第二行,我只想保存第一行,第二行不保存,怎么办?
   Dbgrid中的每一行有没有唯一标识?


#14


因为我在dbgrid的keydown中提取cell中的值,当cell离开时判断所改的值在不在要求的范围内,如果不在我要求的范围内,就用提取的值还原;在这个过程中,当我离开了所在行的话,此时还原的数据就会覆盖当前所在行对应的数据;  这个怎么控制?

#1


先占个1楼

#2


1.编辑时设DBGrid.Enabled := false;编辑完成再设其为true;
2.你试试行不:
  ...
  for i := 0 to DBGrid.SelectedRows.Count - 1 do
  begin
    AdoCtmQry.GotoBookmark(Pointer(DBGrid.SelectedRows[i]));
    AdoCtmQry.Delete;
  end;
  AdoCtmQry.UpdateBatch();

#3


1,在BeforeScroll事件中,记录当前记录
begin
  inherited;
  CBook:= CTable.GetBookmark;
end;
在 afterScroll事件中,记录当前记录
begin
  inherited;
  CBook与当前记录比较
end;
2,AdoCtmQry.delete;应该就删除了。

#4


1.编辑时设DBGrid.Enabled := false;编辑完成再设其为true;
 如果这样的话,我不是不能在DBGrid上修改数据?有没有办法提取DBgrid的行的索引值呢?


AdoCtmQry.delete;应该就删除了
   还是删除不掉;哪怕post 后也删除不掉;只有我选择记录后才行!

#5


问题2
procedure TForm1.Button4Click(Sender: TObject);
var i:Integer;
begin

  for i := 0 to DBGrid1.SelectedRows.Count - 1 do
  begin
    ADOQuery1.GotoBookmark(pointer(DBGrid1.SelectedRows[i]));
    ADOQuery1.Delete;
  end;
  dbgrid1.SelectedRows.Clear;
    //
end;

#6


问题1
procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
begin
  if true then
    abort;//不想post 时候使用,但是DBgrid1的多行选择时候生效的情况下不能阻止多行选择。
end;

#7


呵呵,我回答错了,那是我常用的方法,不在DBGrid中编辑;你试试这个:
这里设ADOQuery1为DBGrid1.DataSource.DataSet
procedure TForm1.DBGrid1StoreKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ADOQuery1.State = dsEdit then
    if Key in [38, 40] then Key := 0;
end;

#8


我没说清楚,不好意思,浪费大家时间了;我的意思是:
   我用以下的语句实现了在DBgrid中 DBGrid.SelectedRows.Delete;AdoCtmQry.UpdateBatch();删除选择的多条记录!(必须在选择的情况下)

  现在我只想删除DBGrid中当前的一条记录.我用AdoCtmQry.delete,为什么不行? 我设置了Dbgrid的Selectrows属性;我删除的记录是在没有选择的情况下,想删除当前指针默认的记录;
    简单点:就是怎么样判断DBgrid中没有记录被选中!
    
          

#9


to:  weizi2000(秋风啊-秋的叹息)
    我的修改不确定.我可以对DBgrid中的多条记录修改.因为我在keydown 和colexit中写了修改代码;当我离开的clounm时候自动修改值;这个时候当我换为其他行的时候,数据修改出现错误,(该修改的本行数据没修改,而是把当前焦点所在行的数据)

#10


在OnAfterInsert  OnAfterEdit事件中:
 DataSetName.Tag := 1;

在保存按钮事件中写:
 Try
   DataSetName.Tag := 0;  //不可少,否则永远都提交不了数据
   DataSetName.Post;
 Except
   DataSetName.Tag := 1
 End;

在DataSet.OnBeforePost事件中写:
  If DataSetName.tag=1 then Abort;


以上代码借用了DataSet.Tag作业互斥条件,因为移动记录的时候,如果数据集在编辑状态下会自动提交,而自动提交心然会调用BeforePost事件。

#11


简单点:就是怎么样判断DBgrid中没有记录被选中!

DBGrid1.SelectedRows.Count

#12


if DBGrid1.SelectedRows.Count>0 then //有记录选中

#13


TO:  kaguo(▲) Guozhi(★★★★★) 
    你的方法解决了我的删除问题;谢谢你;

  第一个问题我只要知道怎么捕捉到Dbgrid在不同的行就可以了;
  比如:我现在在修改第一行的数据,
       接着我又跳到第二行,我只想保存第一行,第二行不保存,怎么办?
   Dbgrid中的每一行有没有唯一标识?


#14


因为我在dbgrid的keydown中提取cell中的值,当cell离开时判断所改的值在不在要求的范围内,如果不在我要求的范围内,就用提取的值还原;在这个过程中,当我离开了所在行的话,此时还原的数据就会覆盖当前所在行对应的数据;  这个怎么控制?