DBGrid使用Crtl+鼠标可以实现多行选择,如果只用鼠标可以实现多行选择吗?

解决方案 »

  1.   

    随便一搜就是一堆,楼主太懒了,呵呵
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes,
      Graphics, Controls, Forms, Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        ADOConnection1: TADOConnection;
        DataSource1: TDataSource;
        Button1: TButton;
        ADOTable1: TADOTable;
        procedure DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        blSelect: Boolean;
        BookMark: TBookMark;
        CurrNo, OldNo: integer;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin //实现 Shift+鼠标左键单击 多选 
      if Button = mbLeft then
      begin
        if not blSelect then
        begin
          BookMark := ADOTable1.GetBookMark;
          OldNo := ADOTable1.RecNo;
          blSelect := True;
          Exit;
        end
        else
        begin
          if ssShift in Shift then
          begin
            CurrNo := ADOTable1.RecNo;
            ADOTable1.DisableControls;
            ADOTable1.GotoBook(BookMark);
            DBGrid1.SelectedRows.CurrentRowSelected := True;
            if CurrNo > OldNo then
            begin
              while CurrNo > ADOTable1.RecNo do
              begin
                DBGrid1.SelectedRows.CurrentRowSelected := True;
                ADOTable1.Next;
              end;
            end
            else
            begin
              while CurrNo < ADOTable1.RecNo do
              begin
                DBGrid1.SelectedRows.CurrentRowSelected := True;
                ADOTable1.Prior;
              end;
            end;
            ADOTable1.EnableControls;
            ADOTable1.FreeBook(BookMark);
            blSelect := False;
            CurrNo := 0;
            OldNo := 0;
          end
          else
          begin
            BookMark := ADOTable1.GetBookMark;
            OldNo := ADOTable1.RecNo;
            blSelect := True;
            Exit;
          end;
        end;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ADOConnection1.Connected := true;
      ADOTable1.Close;
      ADOTable1.TableName := 'Table_Name'; //表名
      ADOTable1.Open;
      DBGrid1.Options := DBGrid1.Options + [dgMultiSelect]; //开启多选
    end;end.
      

  2.   


    {DBGrid的设置,按你原来的设置;增加一个按钮,代码如下。使用时,先点一下按钮,就可以只用鼠标多选了;但一定要记得选择完后再点一下按钮。}procedure TForm1.Button1Click(Sender: TObject);
    begin
      case Button1.Tag of
        0: keybd_event(VK_Control,0,Button1.Tag,0);
        1: keybd_event(VK_Control,0,Button1.Tag+1,0);
      end;
      Button1.Tag := Integer(not Boolean(Button1.Tag));
    end;{不要觉得按钮多余...因为如果没有按钮,选错了如何纠正啊。当然,可以用别的方式执行按钮里的语句}
      

  3.   

    续上:也可以这样做:procedure TForm1.DBGrid1Enter(Sender: TObject);
    begin
      keybd_event(VK_Control,0,0,0);
    end;procedure TForm1.DBGrid1Exit(Sender: TObject);
    begin
      keybd_event(VK_Control,0,2,0);
    end;楼主自己继续研究一下吧。