cxGrid中使用cxGridDBTableView表可以使用多层,如果第一层与第二层只需一列对应,可以设置keyfieldnames,detaikeyfieldNames与masterkeyfieldnames我想问一下,如果第二层需要有两个列同时才能与第一层对应,有没有办法?
解决方案 »
- 刚刚写了一个存储过程,请问如何把这个存储过程里的值用显示到Delphi的Edit里。要用到哪些控件和怎么连接
- fastreport里面的MasterData1怎么显示边框啊??
- Delphi7界面乱码问题
- ****新年散分****
- 如果调用一个已经存在的Ole?
- 如何用zlib将几个文件或一个文件夹压缩?
- 我用adoquery1.SaveFileAs("x.xml")生成一个了xml文件,我要有选择性的从x.xml取一些数据到adoquery2,应该怎么写呢?
- chinawcs在吗?继续求教网页post数据
- 最高分请教,怎样让树状视图每一项都出现 hint 提示?
- 在IE4下为何无法往工具条上增加按钮,也不能往菜单里增加菜单项?我该怎么办?
- 同时给多人发送邮件,隐藏除收件人外的其他地址?
- 如何使用Frame?
第一层和第二层的KeyFieldNames := 'InvCode,InvNo'; //示例:发票代码和发票号码
DetailKeyFieldNames := 'InvCode,InvNo';
MasterKeyFieldNames := 'InvCode,InvNo';
KeyFieldNames可以不止一个字段吧
create table t1 (a varchar2(10),b varchar2(10),c varchar2(30));
insert into t1 values ('a','b','主题1');
insert into t1 values ('a','3','主题2');
insert into t1 values ('b','81','主题3');
create table t2(a varchar2(10),b varchar2(10),items varchar2(10),quantity int)insert into t2 values ('a','b','书',10);
insert into t2 values ('a','b','教材书',15);
insert into t2 values ('a','3','笔',20);
insert into t2 values ('b','81','本子',30);select a,b,a||b keyc from t1select a,b,items,quantity,a||b keyc from t2我用的数据库为oracle,用sqlserver应该也一样,我没有试
步骤1.建一个form1,放入两个oraquery,两个OraDataSource1, 一个orasession
设置好数据库连接
步骤2.在oraquery1加入sql :select a,b,a||b keyc from t1
在oraquery2加入sql :select a,b,items,quantity,a||b keyc from t2
步骤3.设置cxGrid的属性
第二层的masterKeyField为 KEYC,detailKeyField也为 KEYC
目前我在这里试是没有问题的.
2楼的方法,我也试了根本不行,masterkeyfield不允许设置两个列a,b这样就会报错
上面这句话是ExpressDataController帮助中的原话。我想我在上面的贴子中写错了,刚刚去查了一下,应该是分号分隔。
楼主可以试试,不是以逗号分隔,而是分号分隔,象这样:'InvCode;InvNo'
的关键字又个是int类型,一个是varchar的,int那个是自增的,所以不可能改成其他的类型,这样两个不同类型的字段连接有点麻烦。
回阿生:用分号的确不报错,但是第二层完全连接不到第一层了,不知道什么原因,两个字段我都排序了,就是第二层完全没有数据显示。
例子数据库中只有两个表,其中的数据是我另一个应用程序的测试数据,这两个表是典型的发票开票记录主表和明细表。其他表与本示例无关,被我Drop了。示例中没有添加任何代码,只是设置了属性。包括:
ADOConnection一个,ADOQuery两个,DataSource两个。这些不用多说,我只是将两个ADOQuery都Active了。压缩包中有编译好的.exe文件。在cxGrid中,两个View分别名为tvMaster和tvDetail,两个View都取消了组框和过滤框,这个是额外的设置,在此仅仅说明一下,可以不用管它。另外,在tvMaster中,设置了KeyFieldNames为InvCode;InvNo。在tvDetail中,将DetailKeyFieldNames和MasterKeyFieldNames都设置成了InvCode;InvNo,而KeyFieldNames属性为InvCode;InvNo;RowID,因为在明细表中,主键为InvCode+InvNo+RowID,主表与明细表通过InvCode+InvNo来关联,主表的某条记录可能会对应明细表中的多条记录,每条记录以RowID来区分。
但是一个字段连接的时候明明可以的,第一层是Id,第二层是parentId。
我都搞不清那三个属性怎么对应?可不可以讲讲?就是KeyFieldNames,DetailKeyFieldNames,MasterKeyFieldNames这三个,具体代表什么?我可用分只剩90了,明天登录才加分结这个贴给你。
Master查询SQL:Select tid, channelId as chlId, ... from table where ...这样就可以与第二层的ID相同了,不用更改数据库字段名。
只有一个字段对应时,不同的确是可以的。但当有两个字段要对应时,我没试过不同是否可以,我一般是相同字段名称。实在不行你就用 as 别名的方法保持相同吧。2、三个属性的意思很好理解:
KeyFieldNames是指当前层的关键字段名,一般就是当前层所查询的表的主键
MasterKeyFieldNames和DetailKeyFieldNames在第一层不设置,在第二层时设置。分别针对第一层的关键字段和第二层的关键字段。在第二层设置这两个属性后,就与第一层关联起来了。