Delphi checkox在DBgrid中

时间:2018-05-17 12:39:39

标签: delphi checkbox dbgrid

我在Delphi 10.1中有我的应用程序。 我们在表单上使用了组件DBGrid。我想在网格的第一列中添加复选框。所以在网格的drawcell上添加了以下代码:

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;

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

enter image description here

如何删除此标题是真还是假?

2 个答案:

答案 0 :(得分:2)

您当前问题的答案是使用以下代码:

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中的标题被绘制。

不要过分抱怨, 但是,因为如果你点击其中一个复选框,你会立即看到 这个有限的复选框支持实现的问题:单击复选框 激活网格的inplace编辑器,它取代了复选框图像 编辑ftBoolean字段的文本,即“True”或“False”。但是,你的q 没有问过编辑所以这个答案应该停在这里,我想。

如果您想要更全面的复选框支持,只需谷歌

  

delphi dbgrid复选框

并且,在第一次点击中,

  

CheckBox in a DBGrid

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

答案 1 :(得分:1)

我设法通过将布尔字段的DisplayValues属性分配给空值(例如TField.DisplayValues:=';')来解决此问题。

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

P.S。我正在使用Delphi XE3。