zoukankan      html  css  js  c++  java
  • 在Indicator中添加动态Checkbox,无需绑定数据源,支持全选

    先做设置

    DBGrideh属性设置:

    IndicatorOptions =

    [gioShowRowIndicatorEh, //小三角指示

    gioShowRecNoEh,    //数据源行号

    gioShowRowselCheckboxesEh]  //显示CheckBox

    Options = [……, dgMultiSelect]  //开启多选,才能对CheckBox进行编辑

    以上设置完成,功能就有了,对于选中的行进行遍历读取

      for I := 0 to DBGrideh.SelectedRows.Count - 1 do
      begin
        DBGrideh.DataSource.DataSet.Bookmark := DBGrideh.SelectedRows[I];    //定位
       ……    //读取定位后数据源其他操作
      end;
    

    补充全选及反选功能

    DBGrideh.Selection.Rows.SelectAll;    //全选,此时  SelectionType=gstRecordBookmarks
    //下面会提到一个AllowedSelections,结合下文,这里不能用DBGrideh.Selection.SelectAll, 它的SelectionType=gstAll
    DBGrideh.Selection.Clear; //全部取消

    在以上基础上做一个全选功能升级。 

    默认DBGrideh的设置中有如下设置

    AllowedSelections = [gstRecordBookmarks,gstRectangle,gstColumns,gstAll]

    此时,鼠标点击DBGrideh左上角IndicatorTitle可以触发全选事件,不过却无法对全选的数据记录进行利用,查找了下DBGrideh.pas,发现了一段关键的代码

    procedure TCustomDBGridEh.DefaultIndicatorTitleMouseDown(Cell: TGridCoord;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      DropdownMenu: TPopupMenu;
      P: TPoint;
      ARect: TRect;
    begin  
        ......
    end else if (dgMultiSelect in Options) and
        DataLink.Active and ([gstRecordBookmarks, gstAll] * AllowedSelections <> []) then
      begin
        if Selection.SelectionType <> gstNon then
          Selection.Clear
        else if gstAll in AllowedSelections then
          Selection.SelectAll
        else if gstRecordBookmarks in AllowedSelections then
          Selection.Rows.SelectAll;
      end;
    end;
    

    DBGrideh是通过Bookmarks定位数据源游标行的,在此,默认设置AllowedSelections中[gstAll,gstRecordBookmarks],当触发IndicatorTitle鼠标点击事件时,发现上一段代码运行是先检查gstAll,然后检查gstRecordBookmarks,所以虽然全选了,但是无法定位数据源游标,所以只要在AllowedSelections中去掉[gstAll]即可

    -----------------------------------

    回复中有人提出通过此种方法,点击DBGrideh任意地方,所选行容易消失

    解决方法是设置DBGrideh中OptionsEh,使dghClearSelection=false

    设置如下

    OptionsEh = [..., dghClearSelection, ...]//,此内dghClearSelection去掉
        

       

  • 相关阅读:
    Linux网络相关命令firewalld和netfilter、iptables 使用(6/22)
    Linux时间设置与iptables命令
    负载均衡集群ipvsadm命令及基本用法
    LVS原理详解以及部署
    linux比较两个文件的不同(6/21)
    如何使用sql函数平均值、总数、最小值、最大值
    python中数据类型转换
    使用 getopt 处理命令行长参数
    Mysql常用命令行大全
    C#控制台程序使用Log4net日志组件
  • 原文地址:https://www.cnblogs.com/jupt/p/4291902.html
Copyright © 2011-2022 走看看