首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBgrid中的Delphi checkox

DBgrid中的Delphi checkox
EN

Stack Overflow用户
提问于 2018-05-17 20:39:39
回答 2查看 2.5K关注 0票数 2

我用Delphi10.1编写了我的应用程序。我们在表单上使用了组件DBGrid。我想在网格的第一列添加复选框。所以在网格的drawcell上添加了以下代码:

代码语言:javascript
复制
const
CtrlState: array [boolean] of integer = 
 (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK
or DFCS_CHECKED);   
var
  style: UINT;
 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) { grayed }
else
  DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
    CtrlState[Column.Field.AsBoolean]); { checked or unchecked }
end;

复选框将添加到第一列,但带有标题,如下所示:

如何删除此标题True或False?

EN

回答 2

Stack Overflow用户

发布于 2018-05-18 21:37:57

解决当前问题的方法是使用下面这样的代码:

代码语言:javascript
复制
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
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) { grayed }
    else
      DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
        CtrlState[Column.Field.AsBoolean]); { checked or unchecked }
  end
  else begin
    DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.Options := DBGrid1.Options + [dgEditing];
  DBGrid1.DefaultDrawing := False;
  CDS1.CreateDataSet;
  CDS1.InsertRecord([1, True]);
  CDS1.InsertRecord([2, False]);
  CDS1.First;
end;

(CDS1是一个带有ftAutoInc字段和ftBoolean字段的TClientDataSet )

正如您将看到的,将网格的DefaultDrawing设置为False可以防止在DBGrid中绘制布尔型字段的标题。

不过,不要抱太大希望,因为如果你点击其中一个复选框,你会立即看到复选框支持的有限实现的问题:点击复选框会激活网格的就地编辑器,它会用ftBoolean字段的编辑文本替换复选框图像,即'True‘或'False’。但是,你的问题并没有问到关于编辑的问题,所以我认为这个答案应该到此为止。

如果你想要更完整的复选框支持,只需要google

delphi dbgrid复选框

在第一次袭击中,

CheckBox in a DBGrid

第二个答案应该会告诉你更多。此外,我认为你会发现相当多的第三方DBGrid替代品包括对复选框等的支持。

票数 3
EN

Stack Overflow用户

发布于 2019-07-12 16:43:00

我设法解决了这个问题,方法是将我的布尔字段的DisplayValues属性赋给空值,比如TField.DisplayValues := ';‘。

请注意,您可以更改它在DBGrid单元格中显示的内容,而不是True/False。例如,您可以通过将TField.DisplayValues :=设置为“Yes;No”,将其更改为显示Yes/No。因此,如果您将其设置为空值,则不会显示任何内容。

附注:我使用的是Delphi XE3。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50391720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档