关于修改DBGrid的cell的一个超级难问题,100分全给! (100分)

  • 主题发起人 主题发起人 bestrose
  • 开始时间 开始时间
B

bestrose

Unregistered / Unconfirmed
GUEST, unregistred user!
一个cs程序,我用datasource 把一个ClientDataset 和一个DBGrid连起来。
1、先在一个Tedit中输入检索条件,然后ClientDataset根据条件把这条记录从server中取回来。
自然该条记录就显示在DBGrid中啦。
2、现在要在该记录的X字段对应的cell中改变原来的A值,输入一个B值,并判断是否B<A
若是则可以修改,若不是则不能修改。(以上我想都是大家常遇到的情况吧)。
————————————————————————————————————
问题:
1、是我怎么才能获得B的值呢?注意,这时ClientDataSet还没有post,只有当判断条件符合才post
2、在哪个事件中写判断条件语句呢?
a、本来想在oncellchange中写,但在DBgrid中没有该事件
b、也不能在DataSource中的onDatachange和onUpdateData事件中写,因为在上述过程中的第一步也会触发该事件,
导致出错。(在这时更换类似于DBGrid的控件是不可能的,只能继续用DBgrid)
c、在onColexit中写也不可以,因为此时ClientDataSet已经在其日志中写进B,只是没有post而已
---------------------------------------
最后,无论您是否明确解决办法,都请你指点一二,因为无论是否可以解决,都可以给我一点提示
希望就这个问题讨论一下。 谢谢!

鞠躬致敬
 
在Post之前写。
先根据选中的记录得到A了。
ClientDataSet1.Edit;
if ClientDataSet1.Fields.AsFloat<A then ClientDataSet1.Post
else ClientDataSet1.Cancel;
 
好象没办法达到你的要求,DBGrid没有记录数据的,在Post之前系统根本不知道你写了什么·
也不能控制某个CELL,我也是找了久没找到这个功能,现在在自己写这个Grid控件。
 
在该字段的OnSetText事件写入代码
if Sender.AsFloat < StrToFloat(Text) then Sender.Value := Text
else
begin
Sender.DataSet.Cancel;
raise Exception.Create('不允许......');
end;
 
一个办法,就看你行不行:
用一个TEdit动态绑定于那个Cell中,如果修改数据只是再TEdit中修改,至于对TEdit操作
就是你的事情了,当满足要求,也就是A《 B是才正真修改数据,呵呵
不知你行不行,思路是这样的。
至于TField.onsettext or TField.OnGetText其实控制的时候有很多的并发,不太控制的。
 
我觉得在OnSetText里做好了
但可以不加提示
其它好象没什么好办法了
 
DELPHI肯定是可以完成你的要求的
方法有很多,下面介绍一种:
利用Clientdataset的
Clientdataset1.fields.oldvalue//返回字段I的初始值
Clientdataset1.fields.newvalue//返回字段I的最新值
Clientdataset1.fields.curvalue//返回数据库中字段I的当前值
来解决B的获取问题!  
  
再用Dbgrid1.oncolexit事件来检查有效性及更改问题
GOOD LUCK!
 
在该字段的OnChange事件中写
oldv:=DbGrid.Fields.OldValue ;
newv:=DbGrid.Fields.NewValue ;
if newv<oldv then
DbGrid.Fields.value:=newv
else
DbGrid.Fields.value:=oldv
 
在ClientDataset的BeforePost中写
 
谢谢大家,等我明天试完,我会给大家大家加分的。
感觉luckywzy 和飞刀无痕的方法不错,不过别人也会有分的。
 
多人接受答案了。
 
后退
顶部