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可见区域的行号〕

解决方案 »

  1.   

    我不知道你为什么要自己写代码,DBGrid直接支持多选嘛,只要将Options中的dgMultiSelect设定为True就行了
      

  2.   

    是使用shift配合鼠标连续选择,就像listview那样多选
    dbgrid只能安注ctrl一个一个的多选,太慢了!!!
      

  3.   

    1.用第三方控件,比如DevExpress的dxDBGrid,Ehlib的DBGridEh,InfoPower3000的wwDBGrid
    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;
      

  4.   

    for i := 0 to dbgrid.SelectedRows.SelectedCount - 1 do
    begin
      table.GotoBook(pointer(dbgrid.Selectedrows[i]));
       ....
    end;