怎样在DBGridEh1的最前面增加一列CheckBox列(只是便于操作,实际表中没有此列)? ( 积分: 50 )

  • 主题发起人 主题发起人 laiyongjun
  • 开始时间 开始时间
L

laiyongjun

Unregistered / Unconfirmed
GUEST, unregistred user!
用 ClientDataSet1->DataSource1->DBGridEh 建立的数据库软件,现在要在DBGridEh1的最前面增加一列CheckBox列,而这列数据仅仅是临时的,真正的表中根本没有这列数据,应怎么操作?谢谢!

举例:如一个表中有10条记录,而我在其中五条记录的第一列打了“√”,那么现在要对这5条打“√”的记录操作(改变值)。
 
ClientDataSet1 创建一个 InternalCalc 的 Boolean 字段即可。
 
我刚才试了,如何通过代码实现呢?请指点,谢谢!
 
在 ClientDataSet1 里NEW一个字段,CHK
TYPE : BOOLEAN
FIELD TYPE :fkInternalCalc
点击OK

下面是如何写代码:

procedure TForm1.RzBitBtn1Click(Sender: TObject);
begin
with ClientDataSet1 do
begin
First;
while not eof do
begin
if ClientDataSet1.FieldValues['chk'] then
begin
//写你要的事件
end;
Next;
end;
end;
end;
 
非常谢谢kaida、Delphizhou。
如果在ClientDataSet1里把CommandText先填好,然后在Fields Editor中添加InternalCalc 的 Boolean 字段,再把所有的字段添加进去,运行程序一点问题都没有。

但是现在我的情况是CommandText是动态的,要在程序运行后给,如果先在Fields Editor中添加InternalCalc 的 Boolean 字段,程序运行后再给CommandText值,那么程序运行后就只有原来加的Boolean字段,没有表的真正字段,这时,表的字段怎样加到ClientDataSet1中?谢谢!
 
那就全部动态的建立字段...读完了数据后添加一个永久字段.都是动态的
 
1、select cast(0 as int) AS TempCol, StudentNo from student 语句可以创建一个TempCol的临时列,但该列不能修改。用了以下代码后,还是不行:
CDSMaster.FieldByName('TempCol').ReadOnly := False;

with DBGridEh1 do
begin
Columns[0].Checkboxes := True;
Columns[0].KeyList.Clear;
Columns[0].KeyList.Add('1');
Columns[0].KeyList.Add('0');
Columns[0].KeyList.Add('Null;-6;-5;-4;-3;-2;-1;2;3;4;5;6');
Columns[0].AlwaysShowEditButton := True;
end;

2、谢谢frankie_24,读完了数据后添加一个永久字段.都是动态的
===
代码如何实现?
CDSMaster.FieldDefs.AddFieldDef.Name := 'TempCol'不行。
 
实践证明下面方法可行(Delphi 2006 测试通过):
ClientDataSet1.Active:=false;
ClientDataSet1.CommandText:='select False as tmp, ... from TableName';
DBCheckBox1.DataField:='tmp';
ClientDataSet1.Active:=true;
 
谢谢kaida:
ClientDataSet1.CommandText:='select False as tmp, ... from TableName';
这句通不过,我用的是SQL Server 2000,里面没有布尔型。

我主要是想在DBGridEh1里加入Check列:
with DBGridEh1 do
begin
Columns[0].Checkboxes := True;
Columns[0].KeyList.Clear;
Columns[0].KeyList.Add('1');
Columns[0].KeyList.Add('0');
Columns[0].KeyList.Add('Null;-6;-5;-4;-3;-2;-1;2;3;4;5;6');
Columns[0].AlwaysShowEditButton := True;
end;
 
问题已经解决,希望与大家一起分享(感谢CSDN上的Freedom1010):

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
with ClientDataSet1 do
begin
Close;
Fields.Clear;
FieldDefs.Clear;
CommandText := SQLStr1;
FieldDefs.Update;
with TFieldDef(FieldDefs.Insert(0)) do
begin
Name := 'FIELD_NAME';
DataType := ftBoolean;
DisplayName := 'FIELD_NAME';
end;
for i := 0 to FieldDefs.Count - 1 do
FieldDefs.CreateField(ClientDataSet1);
Fields[0].FieldKind := fkInternalCalc;
Open;
end;
end;

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
with ClientDataSet1 do
begin
if Fields[0].Value = Null then Fields[0].AsBoolean := False;
end;
end;
 
多人接受答案了。
 
后退
顶部