读书人

有哪位懂DBGridEH控件怎么实现插入行和

发布时间: 2012-03-20 14:01:11 作者: rapoo

有哪位懂DBGridEH控件如何实现插入行和复制行记录?
有哪位懂DBGridEH控件的来帮我实现一下以下这个功能?麻烦写下详细方法。小弟在此先谢谢大家了!
功能:在dbgridEH当前行第一个字段按insert键时,插入一个空行并将上一行的数据复制到插入行中。
说明:该表有主键字段(HH)。

[解决办法]
当你选中一行时,可以通过数据集得到该条记录的id,比如adoquery1.fieldbyname('id').asinteger,那好,记录下这个id,然后复制时,用一个adoquery(比如adoquery2)去select * from xxx where id= 之前那个id,这样取到记录,剩下的就是
adoquery1.append;
adoquery1.fieldbyname('xxx').asstring := adoquery2.fieldbyname('xxx').asstring;
...
adoquery1.post;
[解决办法]
刚才的字段序号写错了。
procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
begin
field1 := DataSet.Fields[0].AsString;
field2 := DataSet.Fields[1].AsString;
field3 := DataSet.Fields[2].AsString;
end;

procedure TForm1.ADOQuery1NewRecord(DataSet: TDataSet);
begin
DataSet.Fields[0].AsString := field1;
DataSet.Fields[1].AsString := field2;
DataSet.Fields[2].AsString := field3;
end;
[解决办法]

探讨
当你选中一行时,可以通过数据集得到该条记录的id,比如adoquery1.fieldbyname('id').asinteger,那好,记录下这个id,然后复制时,用一个adoquery(比如adoquery2)去select * from xxx where id= 之前那个id,这样取到记录,剩下的就是
adoquery1.append;
adoquery1.fieldbyname('xx……

[解决办法]
首先确认dbgrideh对应的数据集是那一个,然后在那个数据集中写相应的beforeInsert事件,主要的内容就是将dbgrideh对应的数据表再生成一个临时的数据集(字段的内容是与dbgrideh对应的数据集一样的),然后再将dbgrideh对应的数据集的内容复制到临时的数据集中存一下,当然你还要判断一下当前的数据集的记录是否大于0,如果是大于0的才复制(复制功能可能需要你自己写一个函数才行)。然后再在dbgrideh对应的数据集的OnNewRecord事件中再将临时的数据集中你需要复制的记录再复制到dbgrideh对应的数据集中就行了。原理很简单,其实最复杂的还是复制数据集的过程。我提供以下复制数据集的代码给你参考一下,相信你能看得懂:

procedure CopyData(FrData,ToData:TDataSet;NotCopyField:String;Action:String;isPost:Boolean;isCopySysField:Boolean=False);
var I:integer;
StrList:TStringList;
begin
if not (Todata.State in [dsEdit,dsInsert]) then
begin
if Action = 'I' then
ToData.Insert
else
if Action = 'E' then
ToData.Edit
end;
StrList := TStringList.Create;
if not isCopySysField then
begin
StrList.Add('CMCD');
StrList.Add('CREATEBY');
StrList.Add('CREATEDT');
StrList.Add('EDITBY');
StrList.Add('EDITDT');
StrList.Add('APPROVALBY');
StrList.Add('APPROVALDT');
StrList.Add('STATUSFLAG');
StrList.Add('REVISION');
end;
Crlst(StrList,NotCopyField);
Try
for I:= 0 to Todata.FieldCount -1 do
begin
if (Todata.Fields[I].DataType <> ftAutoInc) and
(Todata.Fields[I].FieldKind = fkData) and
(StrList.IndexOf(ToData.Fields[I].FieldName) = -1) and
(Frdata.Fields.FindField(Todata.Fields[I].FieldName) <> nil) then
begin
if not Frdata.Fields.FindField(Todata.Fields[I].FieldName).IsNull then
Todata.Fields[I].Value := Frdata.Fields.FindField(Todata.Fields[I].FieldName).Value
else
Todata.Fields[I].Clear;
end;
end;
if isPost then
Todata.Post;
Finally
StrList.Free;
end;
end;

读书人网 >.NET

热点推荐