我正在尝试将数据库表中的数据显示到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 -
如何解决这个问题?
答案 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;