Dbgrideh 动态checkBox 列生成技巧
在运用DBGRIDEH控件开发过程中,经常需要对表格内的数据进行选定后处理,通常做法是在表格记录的前面增加个checkbox来选定该记录。如果事先知道对应的数据集合的各字段的内容,则可以为DBGRIDEH增加相应的列,并设定列的属性,当然某列可以设置为checkbox显示的方式。
而在我开发实践中,尽量避免为DBGRID增加固定列的方法,因为会对以后程序的维护带来困难。我一般倾向于动态生存各dbgrid列,就是说执行查询时才生成。如果是这样,则设置为checkbox的列就需要动态设置了。这里主要使用创建了一个Tstringlist来过渡,举例如下。
一、存储过程的select 语句
Select Decode(Status, 'R', '1', '0') Flag, --标志为checkbox的列
Carno, Model, Drivername,Driverno,Peccancyno,
From c_Viewonpeccancy
Where Dispatchflag = '4' --后台已接收
And Operationsort = '891' --业务
And Ctrlbureau = p_Tcbranchid
And (Status = 'Q' Or Status = 'R')
And Rjflag = '0'
And Acptdate Between p_Bdate And p_Edate;
二、Dephi源码
执行查询按钮,返回数据后设置,执行setcheckbox(0)会设置dbgrid里第一列为checkbox显示方式。
该方法的实现如下,
procedure Tc_BKPenaltyFrm.SetCheckBox(i: integer);
var
checklist: Tstringlist;
begin
if pDbgrideh1.DataSource.DataSet.Active = True then
try
checklist := Tstringlist.Create; --创建tstringlist列表
checklist.Insert(0, '1'); --增加内容
checklist.Insert(1, '0');
pDBGridEh1.Columns[i].Checkboxes := True;
pDBGridEh1.Columns[i].KeyList := checklist;
pDBGridEh1.Columns[i].Title.TitleButton := False;
finally
checklist.Free;
end;
pDBGridEh1.Columns[i].ReadOnly := False;
end;
对checkbox列的更改会导致数据集的变化,而遍历数据集合就可以实现对选定记录的批量处理。