方法1
http://www.cnblogs.com/jupt/p/4291902.html
在Indicator中添加动态Checkbox,无需绑定数据源,支持全选 - Ehlib学习(二)
先做设置
DBGrideh属性设置:
IndicatorOptions =
[gioShowRowIndicatorEh, //小三角指示
gioShowRecNoEh, //数据源行号
gioShowRowselCheckboxesEh] //显示CheckBox
Options = [……, dgMultiSelect] //开启多选,才能对CheckBox进行编辑
以上设置完成,功能就有了,对于选中的行进行遍历读取
1
2
3
4
5
|
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,发现了一段关键的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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]即可
无需数据集中的字段。
但是,这个 checkbox 很容易消失,只要随便再点击 GRID的 其他 行 就全 没有了。
通过,OptionsEh = [..., dghClearSelection, ...]
//dghClearSelection去掉
方法2
数据集里 有 Boolean字段,自动会显示Checkbox。