我们知道,从数据库表中选出的某些列不是按它的列值显示,需要对这种列作一个映射。
比如表A中的CheckFlag字段,有0,1,2三个值,在数据感知控件(DBGrid)里分别需要显示为:“审核中”、“审核不通过”、“审核通过”。一般有两种做法:
(1)在sql语句中进行处理,在Oracle的SQL Plus中,我们可以用decode来处理,当然这样可以在SQL语句中一步到位,如果使用视图,代码都不需要更改。但是问题也存在,这样的列,我姑且把它叫作虚拟列,数据感知控件只能读取,不能用Post或UpdateBatch方法修改后提交,还是得用SQL语句改。
(2)在代码中解决问题。数据感知控件(DBGrid)可以设PickList和KeyList属性来完成列映射,如果这样的列是一个“普通”的列,OK,问题解决。但是如果这样的列也是一个Decode出来的列,也就是数据库里decode了一遍,DBGrid里还要作映射的话,虽然也可以用PickList和KeyList来作映射,但这样的列还是和(1)的问题一样,不能更改。这个时候就得使用onGetText,onSetText事件了。
这里首先要清楚,数据感知控件读一个Field的值是读TField的Text值而不是Value值,Text与Value实现分离,虽然默认情况下两者是一样的,对于onGetText,onSetText事件的改写,就可以满足更复杂的Text与Value区分的情况。在这里只要在数据集取出数据之后,写一个TField的OnGetText事件,根据输入来写result的值就可以了,这种方法无疑是最灵活的一种,列既可读也可写,当然代码量也最大。
