0

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

我的代码如下在 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以便它将在第一列中显示复选框,但它与标签数据重叠,同样在第二列显示“描述”,在第三列图像。

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

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 - 

如何解决这个问题?

在此处输入图像描述

4

1 回答 1

1

Here is the way that I draw a checkbox in a grid: the DrawColumnCell event has to be defined as follows

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;
于 2013-11-21T08:20:27.087 回答