dbgrid跨页多选,以下是在一页内可多选的代码,就是按住shift可以连续多选
可不能选超过一页的内容
procedure TSortDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
i, Row1, Row2: integer;
begin
if (ssShift in Shift) and (dgMultiSelect in Options) and Datalink.Active then
begin
BeginUpdate;
try
Row1 := Row;
Row2 := MouseCoord(X, Y).Y;
if Row1 < Row2 then
for i := Row1 + 1 to Row2 do
begin
Datalink.DataSet.MoveBy(1);
SelectedRows.CurrentRowSelected := True;
end
else
for i := Row1 - 1 downto Row2 do
begin
Datalink.DataSet.MoveBy(-1);
SelectedRows.CurrentRowSelected := True;
end;
finally
EndUpdate;
end;
end
else
inherited MouseDown(Button, Shift, X, Y);
end;问题的关键在于判断当前鼠标按下时鼠标指向的事记录集的第几条记录
而不是gird的行(row是grid可见区域的行号〕
可不能选超过一页的内容
procedure TSortDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
i, Row1, Row2: integer;
begin
if (ssShift in Shift) and (dgMultiSelect in Options) and Datalink.Active then
begin
BeginUpdate;
try
Row1 := Row;
Row2 := MouseCoord(X, Y).Y;
if Row1 < Row2 then
for i := Row1 + 1 to Row2 do
begin
Datalink.DataSet.MoveBy(1);
SelectedRows.CurrentRowSelected := True;
end
else
for i := Row1 - 1 downto Row2 do
begin
Datalink.DataSet.MoveBy(-1);
SelectedRows.CurrentRowSelected := True;
end;
finally
EndUpdate;
end;
end
else
inherited MouseDown(Button, Shift, X, Y);
end;问题的关键在于判断当前鼠标按下时鼠标指向的事记录集的第几条记录
而不是gird的行(row是grid可见区域的行号〕
dbgrid只能安注ctrl一个一个的多选,太慢了!!!
2.在dbgrids.pas中找到:
procedure ClearSelection;
begin
if (dgMultiSelect in Options) then
begin
// FBooks.Clear;
FSelecting := False;
end;
end;
象上面这样把那句话注释掉,这时候用键盘(shift+箭头)选中的行已经不会
因为纪录的移动而被清除选择了,革命已经成功了99%。剩下的就是自己程序的事情,比如在dbgrid的onkeypress中:procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#32 then
with dbgrid1.SelectedRows do
CurrentRowSelected:=not CurrentRowSelected;
end;
begin
table.GotoBook(pointer(dbgrid.Selectedrows[i]));
....
end;