找回密码
 立即注册

QQ登录

只需一步,快速开始

zzxx19820305

银牌会员

5

主题

19

帖子

3363

积分

银牌会员

积分
3363

活字格认证

zzxx19820305
银牌会员   /  发表于:2011-11-10 10:16  /   查看:10147  /  回复:9
你好。又来麻烦你了。
对于各个Section事件发生的顺序,还是处于一知半解的过程,想请教一下ReportHeader/Footer,
PageHeader/Footer,GroupHeader/Footer,Detail的事件发生条件/顺序。可能有点长,请耐心看,呵呵。
※ 假定上面提到的Section都是Layout里面存在。
在初始时执行(顺序如下):
ActiveReport_ReportStart------------------|
ActiveReport_DataInitialize                    |-----------> ActiveReport初始事件
ActiveReport_FetchData--------------------|

ActiveReport_PageStart------------------------------------|
ReportHeader1_Format------------------------------------|-------->页开始事件
PageHeader_Format(页开始) ------------------------------|

GroupHeader1_Format----------------------------------------|
ReportHeader1_BeforePrint----&gtageHeader事件          |
ReportHeader1_AfterPrint-------&gtageHeader事件         |----->GroupHeader事件
GroupHeader1_BeforePrit-------------------------------------|
GroupHeader1_AfterPrint--------------------------------------|

Detail_Format-----------------------------------------------|
Detail_BeforePrint------------------------------------------|
Detail_AfterPrint--------------------------------------------|--------->各个Detail处理时触发的事件
ActiveReport_FetchData----------------------------------|

GroupFooter_Format--------------------------------------|
GroupFooter_BeforePrint---------------------------------|----->GroupFooter事件
GroupFooter_AfterPrint-----------------------------------|

PageHeader_BeforePrint-----------------------------------|
PageHeader_AfterPrint-------------------------------------|
PageFooter_BefoerPrint------------------------------------|----->该页输出终了
PageFooter_AfterPrint--------------------------------------|
ActiveReport_PageEnd--------------------------------------|

ActiveReport_PageStart--------------------------------------|
PageHeader_Format------------------------------------------|----->新页输出开始
                |
                |
                |
                |
                |
                |
                |
                |
ReportFooter_Format-------------------------------------|
ReportFooter_BeforePrint--------------------------------|
ReportFooter_AfterPrint----------------------------------|
PageFooter_Format---------------------------------------|-------->最后页,输出终了
PageHeader_BeforePrint---------------------------------|
PageHeader_AfterPrint-----------------------------------|
ActiveReport_PageEnd------------------------------------|
ActiveReport_ReportEnd----------------------------------|

执行的顺序,是否是这样?

9 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-11-10 11:25:00
沙发
你好,

从你最近的帖子来看,你对ActiveReports研究相当深入。:strong:

你总结的各个Section事件的执行顺序是最标准的执行顺序,但是ActiveReports在不同报表之间的执行顺序不尽相同,例如:GroupFooter和PageFooter两个区域,如果当前页需要显示GroupFooter,就执行GroupFooter的事件然后是PageFooter事件,反之则只执行PageFooter事件。
回复 使用道具 举报
zzxx19820305
银牌会员   /  发表于:2011-11-10 13:14:00
板凳
呵呵,过奖了,就是感兴趣,现在正在用,顺便学习一下,讨论讨论。
Section的Format与BeforePrint的区别,是不是若想改变控件的背景色/Size等,
只能在Format里面设定,而不能在BeforePrint(即使设定了,也会无视)设定?
对于控件值的设定,在上面哪个事件里面都可以?
还有,BeforePrint,Format是在控件绑定数据之前执行吗?若是,
那么再绑定数据后,不就把在事件中设定的值给冲掉了?
AfterPrint事件,是在绑定数据后执行(也就是说已经输出到PDF上面了吧),这个事件能进行什么样的动作呢?
不好意思,问句有点多
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-11-10 15:27:00
地板
问题1、Section的Format与BeforePrint的区别,对于控件值的设定,在上面哪个事件里面都可以?
回答:对Section本身高度的设置只能在Format中进行,而不能在BeforePrint中设置;Format中可能得不到Section和控件实际的高度,而BeforePrint中可以得到准确的高度;Format和BeforePrint中都可以修改控件的任何属性。

问题2、BeforePrint,Format是在控件绑定数据之前执行吗?那么再绑定数据后,不就把在事件中设定的值给冲掉了?
回答:BeforePrint,Format都是在绑定数据之后执行,Format中可以取到当前控件的值。

问题3、AfterPrint事件,是在绑定数据后执行(也就是说已经输出到PDF上面了吧),这个事件能进行什么样的动作呢?
回答:AfterPrint在之前版本中就有的事件,现在使用的比较少。
回复 使用道具 举报
zzxx19820305
银牌会员   /  发表于:2011-11-10 15:43:00
5#
谢谢回答。
不好意思,我还是不是很明白Format与BeforePrint的区别。
ActiveReport具体后台动作我不知道,我想象是这样的。
1, 加载Layout文件(rpx)
2, 根据Section的属性(例如:ColumnCount,DataFiled)进行展开
3, 对各个Section里面的控件进行赋值(根据DataField从DataSet里面取值)
4, 生成各个页对象
5, 输出

我认为Format的动作是在(3)之前,BeforePrint是在(3)之后执行的。
上面说的是不是不正确?
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-11-10 15:53:00
6#
按你分的步骤,Format应该是第4步,Format之后紧跟着就是BeforePrint,然后是AfterPrint
回复 使用道具 举报
zzxx19820305
银牌会员   /  发表于:2011-11-10 16:16:00
7#
那就是说:
例如有一个TextBox,他的DataField设定为Price,假设对应DB里面的值为200.00,
如果我在Format/BeforePrint里面设定他的值,
Format里面设定为300.00
BeforePrint里面设定为400.00

那么输出后最后显示的结果是400.00?
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-11-10 16:33:00
8#
是这样的,
回复 使用道具 举报
zzxx19820305
银牌会员   /  发表于:2011-11-11 10:12:00
9#
早上好
继续昨天的讨论。
下面是我从你们论坛精华区那边Copy过来的。

区域的事件:
每个区域(PageHeader,Detail ,PageFooter)都有Format,BeforePrint和AfterPrint事件。最好不要在这几个事件中操作报表的Fields集合,而应该在DataInitialize和FetchData中进行。
Format :在数据加载并绑定后触发,只有在这里才可以设置某个区域的高度。
BeforePrint:在区域被生成前触发,在这里如果设置区域的高度是不会有效果的,而且不要在这里操作数据源。
AfterPrint:在区域已经被生成并描画出后发生,可以在该事件里直接在画布上进行描画操作。

问一下,BeforePrint既然是在区域被生成前触发的,而Format又是在数据绑定后触发的,
也就是说数据绑定是在Format前就已经绑定了,BeforePrint和Format间,ActiveReport又做了进行了动作呢?
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-11-11 10:27:00
10#
Format和BeforePrint之间没有任何操作。
Format之前已经绑定好数据,但是生成控件却是在Format中进行的,例如,控件因为值超出而进行了分行显示,控件的高度就会变高,相应的Detail的高度也会随之变高;Format中还会处理控件的字体,颜色等属性设置。Format完成,代表报表已经生成,控件及各个Section的属性都是用于最终打印的属性设置。Format完成后直接进入BeforePrint事件,如果你想对已经生成好的报表进行修改可以在BeforePrint事件中来完成。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部