先做设置
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的设置中有如下设置
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]即可
   
在Indicator中添加动态Checkbox,无需绑定数据源,支持全选 - Ehlib学习(二)
原文:http://www.cnblogs.com/jupt/p/4291902.html