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 也可以实现多选  

原文地址:https://www.cnblogs.com/jijm123/p/12364713.html

时间: 2024-10-13 20:03:46

DBGrid中Shift多选的相关文章

在DBGrid中实现多选功能。

1.首先把DBGrid->options-dgMulitSelect设为True.  dgRowSelect也设为True,此属性设为true后,DBGrid将不能编辑,如何实现能否编辑代码如下 要先引用 uses DBGrids单元 procedure TfrmXJCGHD.CheckBox1Click(Sender: TObject);begin  inherited;  if checkBox1.Checked then  begin    DBGridEh.Options := DBGr

如何实时获取DBGrid 中当前单元格输入的内容?

如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理, 用什么事件呢? 所以Field的Onchange事件是没用的. 这个问题简单啊,每输入1个数据的后就提交(并不是提交到数据库,还是在编辑状态),那么用DataSet就可以取值了 用DBGrid的KeyUp事件: procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;   Shift: TShiftState); beg

(很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]

如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.SelectedField.AsStringDBGrid1.SelectedField.Text看你需要选择 这个问题简单啊,每输入1个数据的后就提交(并不是提交到数据库,还是在编辑状态),那么用DataSet就可以取值了用DBGrid的KeyUp事件: procedure TForm1.DBGrid1Key

在php中验证复选框

PHP接收多个同名复选框信息不像ASP那样自动转换成为数组,这给使用带来了一定不便.但是还是有解决办法的,就是利用javascript做一下预处理.多个同名复选框在javascript中还是以数组的形式存在的,所以在表单提交之前可以利用javascript把复选框中的信息组合成一个字符数组赋值给表单中的隐藏元素,然后用PHP中的explode函数解析此数组,这样就可以实现复选框信息的传递了.下面举例说明. 假设有这样一个表单: <form name="form1" id=&quo

Linux shell脚本中shift的用法说明

Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数: run.sh: #!/bin/bash while [ $# != 0 ];do echo "第一个参数为:$1,参数个数为:$#" shift done 输入如下命令运行:run.sh a b c d e f 结果显示如下: 第一个参数为:a

ABAP中SHIFT用法

1).SHIFT:截断字符串         SHIFT {c} [BY {n} PLACES] [{mode}].:             作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变.如果n超出字符串的长度,则字符串变空,所以在做 此操作的时候要注意n的指定.可以首先获得该字符串的长度,方法:len=STRLEN(C).                 Mode:指定字符串截断的方向.                   LEFT:从左边

QTableView中嵌入复选框CheckBox 的四种方法总结

搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四种比较适合扩展,它除了可以嵌入复选框,还可以通过paint()绘制其它控件,图片等自定义风格. 第一种方法是:编辑委托法 这种方法直接利用委托中重载createEditor(),激活QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件.一般不满足我们实际中的直接显示的需要.可以

C# WinForm中的全选和反选(CheckBox)

方案一: 前置说明: 控件:DEV控件: 选框:除了“全选”框名字为“ckbAll”,其余选框名字依次为:“ckb0,ckb1,ckb2,...ckb12”,区分全选框: 事件:选框事件只用Click事件.(在调试过程中,用Changed事件,会出现类似死循环的情况) 面板:总14个选框,均在面板:StatusPanel上(这里将使用循环获取DEV控件,且是CheckEdit类型时,做单选和全选判定). 由于技术有限,未能良好运用其他控件(如CheckBoxList等),   故,使用Check

C# Word中插入复选框选中符号

object fontname = "Wingdings 2";  object uic = true;    doc.Bookmarks.get_Item(ref lblmark).Range.InsertSymbol(-4014, ref fontname, ref uic, ref missing); C# Word中插入复选框选中符号,布布扣,bubuko.com