我的问题是如何在Delphi 7的dbgrid中设置一个带有复选框项目的列。
提前感谢。
提前感谢。
根据我的测试,最简单和最完整的方法如下:
在您单位的私有部分中,声明一个全局变量来保留网格选项。这将用于在输入复选框列时临时禁用文本编辑,然后进行还原 - 因为这可能是Jordan Borisovin在delphi.about.com文章中提到的一些小错误之一。
private
GridOriginalOptions : TDBGridOptions;
在OnCellClick事件中,如果字段为布尔值,则切换并将更改提交到数据库
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if (Column.Field.DataType=ftBoolean) then
begin
Column.Grid.DataSource.DataSet.Edit;
Column.Field.Value:= not Column.Field.AsBoolean;
Column.Grid.DataSource.DataSet.Post;
end;
end;
为网格中的布尔字段绘制复选框
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
CtrlState: array[Boolean] of integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED) ;
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)
else
DrawFrameControl(DBGrid1.Canvas.Handle,Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
end;
end;
现在是新的部分,当位于布尔列时禁用单元格编辑。 在OnColEnter和OnColExit事件中:
procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
if Self.DBGrid1.SelectedField.DataType = ftBoolean then
begin
Self.GridOriginalOptions := Self.DBGrid1.Options;
Self.DBGrid1.Options := Self.DBGrid1.Options - [dgEditing];
end;
end;
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
if Self.DBGrid1.SelectedField.DataType = ftBoolean then
Self.DBGrid1.Options := Self.GridOriginalOptions;
end;
此外,还需要处理空格键以切换复选框
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if ((Self.DBGrid1.SelectedField.DataType = ftBoolean) and (key = VK_SPACE)) then
begin
Self.DBGrid1.DataSource.DataSet.Edit;
Self.DBGrid1.SelectedField.Value:= not Self.DBGrid1.SelectedField.AsBoolean;
Self.DBGrid1.DataSource.DataSet.Post;
end;
end;
就是这样!
如果您正在使用TClientDataset+TDatasetProvider+TDataset,您可以在数据数组变体到达clientdataset之前操纵它,并包括一个不可更新的布尔字段。
一旦完成,您只需要使用OnDrawColumnCell事件在网格上绘制即可。在这里,我没有使用复选框,而是使用位图(当用户单击时更改为已选择/未选择)。
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
DBGrid1ColEnter(Sender);
end;
就是这样!
好的,我使用了this文章来解决我的问题。但问题是它并没有按照预期工作。所以我改变了代码逻辑,通过将dbgrid中选定的行保存到列表中实现它。
this
)的步骤进行操作吗?教程链接为:http://delphi.about.com/od/usedbvcl/l/aa082003a.htm - TLama