最近开发的DELPHI项目中,遇到这样的一个常见的需求,DBgrid实现多选功能。这个功能第三方控件其实可以直接拿来用,现在我们在不使用三方控件,不添加数据库字段的情况下看如何实现
界面上放入控件,TADOConnection,TADOQuery,TDataSetProvider,TDataSource,TClientDataSet,TDBGRID
TADOConnection->TADOQuery->TDataSetProvider->TClientDataSet->TDataSource->TDBGRID
注意:TDataSetProvider属性Options->poAllowCommandText 设置为TRUE.
TClientDataSet添加一个字段,这个字段不提交数据库,所以添加时注意类型的选择,
我们暂且把他命名为check,类型选择为InternalCalc.
最后就是DBgrid上一些常见的事件实现了,点击修改状态和根据不同状态实现复选框是否打勾。
procedure TMainForm.DBGrid1CellClick(Column: TColumnEh);
var
s:Integer;
begin
if DBGridEh1.DataSource.DataSet.IsEmpty then exit;
if Column.FieldName='check' then
begin
ClientDataSet1.Edit;
s := ClientDataSet1.FieldByName('check').AsInteger;
if s = 0 then
ClientDataSet1.FieldByName('check').AsInteger:=1
else
ClientDataSet1.FieldByName('check').AsInteger:=0;
ClientDataSet1.Post;
end;
end;
procedure TMainForm.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
const
CtrlState: array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var
checkBox_check:boolean;
sRect:TRect;
begin
if DBGridEh1.DataSource.DataSet.IsEmpty then exit;
if Column.Field.FieldName='check'then
begin
sRect.Top := Rect.Top;
sRect.Left := Rect.Left;
sRect.Bottom := Rect.Bottom;
sRect.Right := Rect.Right;
DBGridEh1.Canvas.FillRect(sRect);
checkBox_check := false;
if Trim(Column.Field.AsString) = '1' then
checkBox_check := true;
DrawFrameControl(DBGridEh1.Canvas.Handle, sRect, DFC_BUTTON, CtrlState[checkBox_check]);
end
else
DBGridEh1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;