DBGrid中Shift多选

复制代码
[dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, 
dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit, dgMultiSelect]

相关代码
procedure TFamEditPeople.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  FKeyShift := ssShift in Shift;
end;

procedure TFamEditPeople.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  FKeyShift := False;
end;

procedure TFamEditPeople.DataSource1StateChange(Sender: TObject);
begin
  FOldNo := FRecNo;
  if TDataSource(Sender).DataSet.Active then
    FRecNo := TDataSource(Sender).DataSet.RecNo;
  FKeyShift := False;
end;

procedure TFamEditPeople.DBGrid1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  I: Integer;
begin
  if Button <> mbLeft then
    Exit;
  if not TDBGrid(Sender).DataSource.DataSet.Active then
    Exit;
  if FKeyShift then begin
    FRecNo := TDBGrid(Sender).DataSource.DataSet.RecNo;
    if FKeyShift then DBGrid1.SelectedRows.CurrentRowSelected := True;
    if FOldNo = -1 then
      FOldNo := 1;
    if FRecNo > FOldNo then
      for I := FRecNo downto FOldNo do begin
        TDBGrid(Sender).DataSource.DataSet.RecNo := I;
        TDBGrid(Sender).SelectedRows.CurrentRowSelected := True;
      end
    else
      for I := FRecNo to FOldNo do begin
        TDBGrid(Sender).DataSource.DataSet.RecNo := I;
        TDBGrid(Sender).SelectedRows.CurrentRowSelected := True;
      end;
  end
  else//Shift not pressed
    FOldNo := TDBGrid(Sender).DataSource.DataSet.RecNo
end; 



实现DBGrid Shift+鼠标左键单击 多选 
关键字: DBGrid Shift 多选 
分类 : 个人专区 
密级 : 公开 
(评分: , 回复: 0, 阅读: 96) &raquo;&raquo; 
unit Unit1;

interface

uses
  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.GotoBookmark(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.FreeBookmark(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.

//另外,Shift+小键盘UP/DOWN 也可以实现多选  
复制代码

 

posted on   癫狂编程  阅读(239)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2019-02-25 继承Tcalendar控件,让当天日期醒目显示
2019-02-25 TLabel的FocusControl属性什麽意思
2019-02-25 Delphi Try Except 实例
2019-02-25 如何有效地让一个“ParentFont = False”子控件使用与父母相同的字体名称?
2019-02-25 窗体的构造函数和OnCreate事件

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示