我都要疯了,三层,客户端clientdataset+dbgrid, 在编辑dbgrid时,修改记录后,不能上下移动,老出现:“Trying to modify read-only field”我知道它的意思,可我发现我从中间层取过来的数据有的字段就是只读, 在客户端修改也不行!到底是为啥?
解决方案 »
- 一个函数在程序里执行的时候返回值不稳定,高手进,内详
- delphi7 如何调用xp外观
- 不知Delphi能否像VB那样实现此窗体
- 一个很奇怪的问题,很有意思的....
- 怎么在IIS中发布Delphi开发的CGI类型的Web Service并在Delphi中调用?
- D6的ADO连接SQL SERVER 2000的奇怪问题
- 今天开心!散分喽!
- 这样一个简单的交换控件的name属性也会出错??在线等,当场结贴给分~
- 我要做一个plug-in或Add-in技术架构的系统,谁可以给点意见?
- 请问windows里每个应用程序的句柄是不是不变的?(重起以后!)
- 急救:三层结构中,客户端退出后即无法连接服务器
- 如何将fastreport中的MEMO的内容自动缩小字体?
2。中间层使用Union语句,在客户端一般也是不可以编辑的。
3。中间层使用计算字段(如Price*Count as Total),则Total这个字段是不能编辑的。
4。其他的情况。
写在ClientDataSet打开之后即可procedure SetDstAllFieldCanEdit(dstNm: TClientDataSet; AddFields: string='');
var tmpDst: TClientDataSet;
I: Integer;
begin
tmpDst := TClientDataSet.Create(nil);
Try
dstNm.DisableControls;
tmpDst.Data := dstNm.Data;
dstNm.Close;
dstNm.FieldDefs.Clear;
for I := 0 to tmpDst.FieldDefs.Count - 1 do
begin
with dstNm.FieldDefs.AddFieldDef do
begin
DataType := tmpDst.FieldDefs[I].DataType;
Size := tmpDst.FieldDefs[I].Size;
Name := tmpDst.FieldDefs[I].Name;
end;
end;
// CreateAttachColumns(dstNm,AddFields);
dstNm.CreateDataSet;
with tmpDst do
begin
First;
while not Eof do
begin
dstNm.Append;
for I := 0 to Fields.Count - 1 do
dstNm.Fields[I].Value := Fields[I].Value;
Next;
end;
end;
if dstNm.State in [dsInsert,dsEdit] then dstNm.Post;
dstNm.MergeChangeLog;
Finally
dstNm.EnableControls;
tmpDst.Free;
End;
end;