如何自定义TDBAdvGrid列以显示数据库中的数据?

时间:2013-11-21 06:20:18

标签: delphi delphi-xe3 dbgrid uniquery

我正在尝试将数据库表中的数据显示到DBAdvGrid中,以便第一列仅显示复选框,而其他3列将显示数据库表中的标签,描述和图像字段。 我正在使用UniConnection,UniQuery,UniDatasource组件来显示数据。我通过代码设置UniConnection数据库属性,因为我可以给出数据库的相对路径而不是完整路径。在对象检查器中,它只接受数据库的fiull路径。

我的代码如下 在FormCreate活动

  filepath1 := ExtractFilePath(Application.ExeName);
  UniConnection1.Database := filepath1+'empdata.s3db';
  UniConnection1.Connected := True;
  UniQuery1.SQL.Text := 'Select '', label, description, image from emp';
  UniQuery1.Open;

  DBAdvGrid1.Columns[0].FieldName := '';
  DBAdvGrid1.Columns[2].FieldName := 'label';
  DBAdvGrid1.Columns[3].FieldName := 'description';
  DBAdvGrid1.Columns[4].FieldName := 'image';

上面的代码成功连接并显示数据,但问题是在DBAdvGrid上显示数据,因为我希望第一列只显示复选框(没有数据来自DB)。在DBAdvGrid中,我无法通过对象检查器设置特定列的字段名称,因为它通过代码通过提取路径连接到数据库。

我已将DBAdvGrid编辑器类型属性的第一列设置为edDataCheckBox,以便它在第一列中显示复选框,但它会与标签数据重叠,类似于第二列显示'描述'和第3列图像。

如何通过代码自定义它以便显示

1st column - No Data
2nd column - label
3rd column - description
4th column - image

我得到的是

1st column - label overlapped with checkbox
2nd column - description
3rd column - image {MEMO}
4th column - 

如何解决这个问题?

enter image description here

1 个答案:

答案 0 :(得分:1)

以下是我在网格中绘制复选框的方式:DrawColumnCell事件必须定义如下

const
 IsChecked : array[0..1] of Integer =
             (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);

procedure TForm.DBAdvGrid1DrawColumnCell(Sender: TObject;
          const Rect: TRect; DataCol: Integer; Column: TColumn;
          State: TGridDrawState);
var
 DrawRect: TRect;

begin
 if column.Index = 1 then  
  begin
   DrawRect:= Rect;
   drawrect.left:= rect.left + 24;
   InflateRect (DrawRect, -1, -1);
   DBAdvGrid1.Canvas.FillRect (Rect);
   DrawFrameControl (DBAdvGrid1.Canvas.Handle, DrawRect, DFC_BUTTON,
                     ISChecked[Column.Field.AsInteger]);
  end
 else DBAdvGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
end;