一、数据库中增加一个字段
- 给数据库中增加一个字段(sqlserver:bit类型,oracle:char(1)类型),值为0或1。
- DBGridEh表格中列属性CheckBoxes设置为True,将KeyList设置为0和1.。
- 设置完成,点击复选框,即可选中与取消选择,同时数据库中的该字段值也对应改变。
- 设置DBGridEh表格中的OnTitleClick函数,点击表头,实现全选与全消。
具体实现:
增加字段
设置复选框
设置KeyList
点击单元格选择
数据库同步字段值修改
全选
全消
点击表头全选全消事件源码
procedure TForm1.dbgrdh1TitleClick(Column: TColumnEh);
var i:integer;
begin
if column.Index=0 then
begin //验证是否第一列
qry1.First; //游标回滚
dbgrdh1.SelectedRows.CurrentRowSelected:=true; //第一行被选中
if trim(column.Title.Caption)='全选' then
begin
for i:=0 to dbgrdh1.DataSource.DataSet.RecordCount-1 do
begin
dbgrdh1.Fields[0].DataSet.edit;
dbgrdh1.Fields[0].Value := '1';
dbgrdh1.Fields[0].DataSet.post;
dbgrdh1.datasource.dataset.next;
end;
column.Title.Caption:='全消';
end
else
begin
for i:=0 to dbgrdh1.DataSource.DataSet.RecordCount-1 do
begin
dbgrdh1.Fields[0].DataSet.edit;
dbgrdh1.Fields[0].Value := '0';
dbgrdh1.Fields[0].DataSet.post;
dbgrdh1.datasource.dataset.next;
end;
column.Title.Caption:='全选';
end;
qry1.First; //游标回滚
dbgrdh1.SelectedRows.CurrentRowSelected:=true; //选中第一行
end;
end;
注意:在设置DBGridEh中的数据源时候,最好一列一列绑定对应数据库中的字段,不要自动默认显示数据库中数据,不然的话,会发现在对象属性控制板块修改的数据无法保存,运行之后无效。
二、数据集中增加一列
- 数据库连接顺序:ADOConnection ->ADODataSet->DataSetProvider->ClientDataSet->DataSource->DBGridEh
- 设置DataSetProvider->Options->poAllowCommandText属性为True
- 设置点击按钮事件btn1Click,获取数据,给数据集中增加一列复选框
- 设置点击单元格事件dbgrdh1CellClick,实现选中或未选择
效果如下:
实现代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGridEh, StdCtrls, DBClient, Provider;
type
TForm1 = class(TForm)
dbgrdh1: TDBGridEh;
con1: TADOConnection;
ds1: TADODataSet;
dtstprvdr1: TDataSetProvider;
ds2: TClientDataSet;
ds3: TDataSource;
btn1: TButton;
procedure dbgrdh1CellClick(Column:TColumnEh);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
//获取数据,新增一列
procedure TForm1.btn1Click(Sender: TObject);
var
i:Integer;
sqlStr:string;
begin
sqlStr:='select * from student';
with ds2 do
begin
Active:=False;
Fields.Clear;
CommandText:=sqlStr;
FieldDefs.Update;
with TFieldDef(FieldDefs.Insert(0)) do
begin
Name:='TempCol';
DataType:= ftBoolean;
end;
for i:=0 to FieldDefs.Count-1 do
FieldDefs[i].CreateField(ds2);
Fields[0].FieldKind:=fkInternalCalc;
Execute;
Active:=True;
end;
with dbgrdh1 do
begin
Columns[0].Checkboxes:=True;
Columns[0].KeyList.Clear;
Columns[0].KeyList.Add('1');
Columns[0].KeyList.Add('0');
Columns[0].AlwaysShowEditButton:=True;
end;
end;
//点击单元格,实现选中或未选中
procedure TForm1.dbgrdh1CellClick(Column: TColumnEh);
begin
if Column.FieldName='fselect' then
begin
ds1.Edit;
if ds1.FieldByName(Column.FieldName).AsString ='1'
then
ds1.FieldByName(Column.FieldName).AsString:='0'
else
ds1.FieldByName(Column.FieldName).AsString:='1';
ds1.Post;
end;
end;
end.