delphi – DBGrid中的CheckBox
发布时间:2020-12-15 09:40:11 所属栏目:大数据 来源:网络整理
导读:我的问题是如何在Delphi 7中的dbgrid中设置一个列,其中包含一个复选框项. 提前致谢. 解决方法 我测试的最简单,最完整的方法如下: 在单元的私有部分中,声明一个全局用于保留网格选项.在输入复选框列时临时禁用文本编辑后,它将用于恢复 – 因为这可能是Jordan
我的问题是如何在Delphi 7中的dbgrid中设置一个列,其中包含一个复选框项.
提前致谢. 解决方法
我测试的最简单,最完整的方法如下:
在单元的私有部分中,声明一个全局用于保留网格选项.在输入复选框列时临时禁用文本编辑后,它将用于恢复 – 因为这可能是Jordan Borisovin关于delphi.about.com文章提到的一个小错误 private GridOriginalOptions : TDBGridOptions; 在OnCellClick事件中,如果field是boolean,则切换并将更改发布到数据库 procedure TForm1.DBGrid1CellClick(Column: TColumn); begin if (Column.Field.DataType=ftBoolean) then begin Column.Grid.DataSource.DataSet.Edit; Column.Field.Value:= not Column.Field.AsBoolean; Column.Grid.DataSource.DataSet.Post; end; end; 绘制网格的布尔字段的复选框 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) ; begin if (Column.Field.DataType=ftBoolean) then begin DBGrid1.Canvas.FillRect(Rect) ; if (VarIsNull(Column.Field.Value)) then DrawFrameControl(DBGrid1.Canvas.Handle,Rect,DFC_BUTTON,DFCS_BUTTONCHECK or DFCS_INACTIVE) else DrawFrameControl(DBGrid1.Canvas.Handle,CtrlState[Column.Field.AsBoolean]); end; end; 现在是新的部分,在布尔列中禁用单元格编辑.在OnColEnter和OnColExit事件上: procedure TForm1.DBGrid1ColEnter(Sender: TObject); begin if Self.DBGrid1.SelectedField.DataType = ftBoolean then begin Self.GridOriginalOptions := Self.DBGrid1.Options; Self.DBGrid1.Options := Self.DBGrid1.Options - [dgEditing]; end; end; procedure TForm1.DBGrid1ColExit(Sender: TObject); begin if Self.DBGrid1.SelectedField.DataType = ftBoolean then Self.DBGrid1.Options := Self.GridOriginalOptions; end; 更重要的是,处理空格键以切换复选框 procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ((Self.DBGrid1.SelectedField.DataType = ftBoolean) and (key = VK_SPACE)) then begin Self.DBGrid1.DataSource.DataSet.Edit; Self.DBGrid1.SelectedField.Value:= not Self.DBGrid1.SelectedField.AsBoolean; Self.DBGrid1.DataSource.DataSet.Post; end; end; 而已! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |