【水晶报表内功心法】--信手拈来,掌控对象

阿泰 2009-07-05 02:30:28
加精
索引

.【水晶报表内功心法】--序言

.【水晶报表内功心法】--推拉之间

.【水晶报表内功心法】--PULL模式样板招式

.【水晶报表内功心法】--PUSH模式样板招式
============================================================

月初一如既往地忙碌,竟然一点时间也没抽出来。
周末也是一如既往地加班了,好在事情进展地还算顺利,终于有时间写这一篇。

本来的计划是《掌控于股掌之间-代码中传参数、传公式、操作水晶报表里的所有对象
考虑到公式的重要性,会单独写一篇,于是本篇的内容就是参数与对象的控制
而参数的部分,在本篇也是基本操作,后续的进阶操作会结合其他环节进一步说明

1.对象的操作


开始之前

先说一下,操作对象,是依靠ReportDocument,
基础代码如下:
ReportDocument myReport = new ReportDocument();
string reportPath = Server.MapPath("crystalreport1.rpt");
myReport.Load(reportPath);

//PULL或PUSH方式的数据处理
//...
CrystalReportViewer1.ReportSource = myReport;

//然后,才是下文中的代码


关于水晶报表里的对象,我们直观的来看一下。
在模板空白处点邮件,选“插入”,鼠标放到“特殊字段”上,不要点,会出现如下菜单。

上面这些,都是报表对象或说是报表部件。恩,这些我们都可以进行控制。

操作的基本语法是:
myReport.ReportDefinition.ReportObjects[对象序号].方法或属性;
//或
myReport.ReportDefinition.ReportObjects[对象名称].方法或属性;


对象序号在 .Net的水晶报表版本里很难直观的看出来,一般他是按加入报表的顺序来排的
这个很难去记住。有时候为了一些需要,在遍历的时候会用的到。
一般我们会用名称
在对象上点右键,设置对象格式,

在出来的界面上就可以看到对象的名称

ReportObjects就是我们前面所指的报表对象集合,单一对象就是一个ReportObject
对于ReportObject来说,通用的属性有这样一些

一般我们可以控制对象的位置,通过控制左上角的坐标,也就是top和left属性。
这里说一下水晶报表的坐标系和计量单位。

水晶报表的坐标系,以每个节的左上角为原点,往下往右两个方向递增延展。
计量单位是缇,与厘米的换算关系是:1厘米=567缇
所以在后面的代码中,你会看到我有这样的写法: 567*N 其实也就是N厘米。


另外还有ObjectFormat下面的属性,可以控制对象的隐藏与显示,这个很实用吧,呵呵。


如抑制显示可以这样操作:
myReport.ReportDefinition.ReportObjects("text4").ObjectFormat.EnableSuppress = true;


ReportObject是个通用对象,而其实际上又是一个具体的对象。他有各自的特殊属性。
以文本框为例,他就会多出一些特性,比如Text属性,这样我们可以修改到文本框的内容。

具体操作如下:
//更改一个文本框的内容
TextObject x;
x = (TextObject)myReport.ReportDefinition.ReportObjects["text4"];
x.Text = "我们的世界";


另外说一下,前面没提到的数据字段,也可以这样操作。

//调整字段的位置
FieldObject fo;
fo = (FieldObject)myReport.ReportDefinition.ReportObjects["NAME1"];
fo.Height = 567 * 3;
fo.Width = 567 * 4;
fo.Left = 567 * 1;


每个对象都有各自不同的属性,至于具体有多少对象,你可以按一下F2,
CrystalDecisions.CrystalReports.Engine这个命名空间下,以 Object结尾的,基本都是。


2:子报表里对象的操作
子报表里的对象操作跟主报表是一样的,主要是要先找到这个子报表对象。

下面这个方法是不对的
SubreportObject subObj;
subObj = (SubreportObject)myReport.ReportDefinition.ReportObjects["subreport1"];
这个只会定义子报表在主报表内的特性,不能设置到子报表内的部件

要这样
myReport.Subreports[子报表序号].ReportDefinition.ReportObjects["xx"];
//序号从0开始计数,单纯子报表的一个序号
//或
myReport.Subreports[子报表名称].ReportDefinition.ReportObjects["xx"];

注意这个名称不是我们在子报表上点右键看到的名称,而是我们在设计子报表时指定的子报表名称



TextObject subtext;
subtext = (TextObject)myReport.Subreports["xyz"].ReportDefinition.ReportObjects["text3"];
subtext.Text = "我是子报表里的内容哦";


3:参数的基本操作
参数是程序与报表交互的一个重要媒介,本节只做一个基础说明,后续的章节中会进一步介绍。
新建一个参数p1



拖到模板上,会自动显示为 ?pa1


代码中传递参数给报表的代码为:
SetParameterValue 后面的几个参数依次为:参数名称,参数值,子报表名称(如果是子报表参数的话)。
myReport.SetParameterValue("pa1", "我是一个参数");


在子报表中建立一个新的参数spa1,注意xyz是子报表名称
myReport.SetParameterValue("spa1", "我是一个参数","xyz");


当然,参数也可以传递给CrystalreportViewer,这里就不展开说了,用到的时候再说。

单纯从这个代码上来看,textbox和参数似乎可以等价
但是textbox一般只能用于显示一个字符串,但是参数则可以参与公式,过滤数据,控制对象的一些特性等等,用途更广泛一些。


好了,就到这里。这个基本上没有什么需要特别注意的。

修正记录:
20090707:
坐标系原点应该是每个节的左上角,而不是整个模板的左上角

下一篇:如何过滤数据


...全文
9945 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
rrsaw 2011-11-04
  • 打赏
  • 举报
回复
从 输入参数值 的窗口输入的值能正常传递给pa1,但是后台设置的 (例如:我是一个参数)却不能传给pa1.这个要怎么处理?
rrsaw 2011-11-04
  • 打赏
  • 举报
回复
泰哥,我也是按照你的这个方法: myReport.SetParameterValue("pa1", "我是一个参数"); 想要在后台随时改变(或者赋值给pa1) pa1的值,可是每次都要弹出 输入参数值 的窗口。怎么办?
ps: 例如 参数 pa1,是从表中读取的值,然后赋值给pa1显示,不能从窗口输入。
蝜蝂 2011-08-24
  • 打赏
  • 举报
回复
怎么也搞不懂 绑定水晶报表和绑定 gridview有什么区别,今天终于弄明白了
xiaohuizi2009 2011-07-12
  • 打赏
  • 举报
回复
热爱泰哥。。。
xiaohuizi2009 2011-07-12
  • 打赏
  • 举报
回复
我热爱泰哥。。。
lzh9692193 2011-05-25
  • 打赏
  • 举报
回复
泰哥,请问下怎么用语句来设定主子表间的链接?我主子表都是用公式字段,所以没办法在给右击插入子表时设定链接
limii 2011-05-23
  • 打赏
  • 举报
回复
mark.............
huohufeixue 2011-03-15
  • 打赏
  • 举报
回复
不错,谢谢楼主
xx_521 2011-01-13
  • 打赏
  • 举报
回复
在一行中,拖入一个字段,把字段拉的和行一行宽,显示的时候,这个一行怎么不显示全再换行呢,右边总是还有一部分空白,该数据字段在格式编辑器中把文本解释,设置成了HTML文本。大体效果就是,一行不显示完就换行了,不知怎么回事。有谁知道吗?
mouserice 2011-01-13
  • 打赏
  • 举报
回复
感谢阿泰分享!! 
rjianfeili 2010-11-25
  • 打赏
  • 举报
回复
标记~~学习中`~
willy2013 2010-11-25
  • 打赏
  • 举报
回复
谢谢阿泰!!!学习中……
jiaoqiuge 2010-11-06
  • 打赏
  • 举报
回复
必須標記加收藏!
xx_521 2010-11-03
  • 打赏
  • 举报
回复
当新建一个报表文件时(.rpt文件)后,我想在详细资料中放入除了数据表已有的字段外的其他字段,比如一张用户信息表,中有一个部门id,是部门表的外键,我想显示部门的名称,我查询用户信息的时候通过内连接查询到了该用户的部门名称,都封装在用户实体中。这个时候要想让它显示用户的信息,包括部门名称,应该怎么弄呢。
reason159 2010-08-26
  • 打赏
  • 举报
回复
继续学习中
ggxboy1986 2010-08-04
  • 打赏
  • 举报
回复
强········
cxlovezj 2010-06-13
  • 打赏
  • 举报
回复
额 正准备学习水晶报表 谢谢了
togetherupcode 2010-05-31
  • 打赏
  • 举报
回复
您好,我正在做这个水晶报表,但是他在最后的
newReport.PrintToPrinter(1, false, 1, 1);
这一句老是报错ParameterFieldCurrentValueException缺少参数
请问要怎么解决啊
huyouhula 2010-05-28
  • 打赏
  • 举报
回复
跟踪!!!!!传说回复内容太短了!
flongsoftware 2010-03-28
  • 打赏
  • 举报
回复
阿泰,请有空帮我解决这个问题:
我要在报表中求出组名所在的页数(呵呵.说不清楚)
举个例子:
编号 名称 首字拼音
001 abc a
002 acd a
004 dcd d
005 ggg g
006 gff g


以首字拼音分组后

a
001 abc
002 acd
d
004 dcd
g
005 ggg
006 gff

现在想知道组名a,d,g所在页数,怎么求?
小弟初学,请帮帮忙啊


加载更多回复(31)

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧