最近因为一个项目的原因想在DBGrid加入Checkbox,当然同样的功能Ehlib已经有一个控件DBGridEh已经实现。但是我不太喜欢它因为它太复杂了,而我又是一个比较赖的人,于是就想一个简单一点的方法,后来在橙子的博客发现了一段代码,拿来一试,呵呵搞定!
我们开始吧
1、新建一个项目,在其中加入ADOConnection1,ADOQuery1,DataSetProvider1, ClientDataSet1,DataSource1,DBGrid1,设定好ADOConnection1,和ADOQuery1,DataSetProvider1的Dataset属性设置为ADOQuery1,ClientDataSet1的ProviderName设定为
DataSetProvider1,在ClientDataSet1中加入所有字段,再在其中新建一个InternalCalc类型的字段“CHECKBOX”.接下来就写代码吧
2、
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
CtrlState: array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var
checkBox_check:boolean;
begin
if Column.Field.FieldName ='CheckBox' then
begin
DBGrid1.Canvas.FillRect(Rect);
checkBox_check:=false;
if Trim(Column.Field.AsString)='1' then checkBox_check:=true;
DrawFrameControl(DBGrid1.Canvas.Handle,Rect, DFC_BUTTON, CtrlState[checkBox_check]);
end else DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if Column.Field.FieldName ='CheckBox' then
begin
with DBGrid1.DataSource.DataSet do
begin
if state<>dsEdit then Edit;
if Trim(Column.Field.AsString)='1' then FieldByNAME('CheckBox').AsInteger:=0 ELSE
FieldByNAME('CheckBox').AsInteger:=1;
Post;
end;
end;
end;
编译运行一下,搞定了吧。