1、指定报表的相对路径。
方法一: like this:use add ..\ before the path
Code
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"
AutoDataBind="True" Height="50px" ReportSourceID="CrystalReportSource1"
Width="350px" />
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server" >
<Report FileName="..\Base\First.rpt" >
</Report>
</CR:CrystalReportSource>
方法二:代码动态指定.
C#:
Code
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
InitPage();
}
}
private void InitPage()
{
string pathMain, pathName;
pathMain = Server.MapPath("\\Base");
pathName = pathMain + "\\First.rpt";
this.CrystalReportSource1.Report.FileName = pathName;
}
前台:
Code
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"
AutoDataBind="True" Height="50px" ReportSourceID="CrystalReportSource1"
Width="350px" />
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server" >
<Report>
</Report>
</CR:CrystalReportSource>
2、设置报表的字段自动换行
方法1:右击想操作的字段,选择设置对象格式,选择“可以增大”
3、设置日期格式
方法1:右击想操作的字段,选择设置对象格式--可以选择已经设置好的,或者自定义格式字符串
4、动态指定数据源。摘自:http://www.cnblogs.com/VS2008/archive/2006/05/21/405488.html
在以前
VS2003
中可以采用
PUSH
模式推报表,可以用如下的代码实现:
在
VS2005
中不再支持“
embedded report
”嵌入式报表,
只能采用非嵌入式报表的方法拉数据,下面是典型的代码:
//
绑定报表数据
private
void
BindCrystalReports()
{
string path1 = Server.MapPath("~\\Report\\");
string path2 = path1 + "repOrder.rpt";
ReportDocument repDoc = new ReportDocument();
repDoc.Load(path2);
SetDBLogonForReport(repDoc); //设置数据登录信息
crOrder.ReportSource = repDoc;
string selectionFormula = "{htOrder.htID} =" + txtHtID.Text.Trim();//设置报表数据筛选公式
repDoc.DataDefinition.RecordSelectionFormula = selectFormula;
crOrder. DataBind ();
}
//
设置登录信息
private
void
SetDBLogonForReport(ReportDocument reportDocument)
{
try
{
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = ConfigurationManager.AppSettings["ServerName"];
connectionInfo.DatabaseName = ConfigurationManager.AppSettings["DatabaseName"];
connectionInfo.UserID = ConfigurationManager.AppSettings["UserID"];
connectionInfo.Password = ConfigurationManager.AppSettings["Password"];
Tables tables = reportDocument.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
TableLogOnInfo tableLogonInfo = table.LogOnInfo;
tableLogonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogonInfo);
}
}
catch
{
lblNote.Text = "<script>alert('数据库登录信息不正确!');</script>";
}
}
这种方式是不是太频繁琐了,在数据结构更改或者查询条件发生变化时必须要再次更改报表设置,那么在
VS2005
中水晶报表有没有更简洁的方法呢?最好不用写代码就能搞定呢?有,那就是新的数据绑定控件
CrystalReportSource
,这个控件与
SqlDataSource
数据源绑定控件一起连用就可以用
SQL
表达式作数据源推数据了。下面是实现的步骤:
1. 建立水晶报表,注意报表要用OLE DB ADO方式连接数据源,这样可以省去报表登录窗口的弹出。
2. 在设计视图中拖拉报表控件CrystalReportViewer,点击右上角智能标签设置报表数据源,选择报表文件,自动生成CrystalReportSource,这时在设计视图中将显示出报表界面,水晶报表将自动用初始数据填充报表字段。注意这里有个小Bug,如果报表在子目录中,选择报表文件将自动用相对路径表示,这时报表显示会出错,应改成绝对路径才可以。
<Report FileName="report\rptOrder.rpt">这里应改成:<Report FileName="..\report\rptOrder.rpt">
3.拖拉一个数据源控件SqlDataSource(也可以用ObjectDataSource),按向导生成数据源,这里可以筛选数据,根据情况选择各类数据源。
4.如何将CrystalReportSource与SqlDataSource两个控件连接在一起呢?可以这样:选择CrystalReportSource控件点击右侧属性中数据栏,再点击Report选择DataSource,在这个数据源集合编辑器选择数据源指定报表名称即可。(下面的Parameters是用来选择报表参数用的)
经过这几个步骤,就可以运行程序显示报表啦,怎么样不用写一句代码吧?
具体代码可参考如下:
<
CR:CrystalReportViewer
ID
="crOrder"
runat
="server"
AutoDataBind
="True"
ReportSourceID
="ReportSourceOrder"
BestFitPage
="False"
DisplayToolbar
="False"
DisplayGroupTree
="False"
Height
="1042px"
Width
="775px"
EnableParameterPrompt
="False"
/>
<
CR:CrystalReportSource
ID
="ReportSourceOrder"
runat
="server"
>
<
Report
FileName
="..\report\rptOrder.rpt"
>
<
DataSources
>
<
CR:DataSourceRef
DataSourceID
="SqlDataSourceOrder"
TableName
="htOrder"
/>
</
DataSources
>
</
Report
>
</
CR:CrystalReportSource
>
<
asp:SqlDataSource
ID
="SqlDataSourceOrder"
runat
="server"
ConnectionString
="<%$ ConnectionStrings:cc_2005 %>"
SelectCommand
="SELECT * FROM [htOrder] "
></
asp:SqlDataSource
>
5、自定义报表格式 摘自:http://www.cnblogs.com/zxsoft/archive/2007/11/28/974933.html
Code
1.使用VS2005新建一个水晶报表项目
[图1]
2.选择空白报表
[图2]
3.字符资源管理器中右键数据库字段,选择"数据库专家"
[图3]
4.展开"创建新连接","OLE DB (ADO)",双击"建立新连接"
[图4]
5.选择"Microsoft OLE DB Provider for SQL Server"。
[图5]
注:如果使用别的数据库,则相应选择对应的驱动。如Access用"Microsoft Jet 4.0 OLE DB Provider",或Access 2007用"Microsoft Office 12.0 Access Database Engine Ole DB Provider",或SQL Server 2005用"SQL Native Client"等等
6.选择对应的表,并点击">"按钮。
[图6]
7."字段资源管理器"中,"组名字段"上右键。选"插入组"。
[图7]
8.分组依据字段选择OrderId,再点击"选项",选中"将组放在同一页上"。
[图8]
[图8-2]
9.按上面的方法,在"运行总计字段"上右键新键。找到amount字段,点">"按钮,并在"重置"选项组中选择"组更改时",如图所示。然后"确定"。
[图9]
10.需要创建的字段已经都创建好了,按下图的方法拖到报表设计器中。其中,"记录号"字段在"字段资源管理器"的"特殊字段"里。"productid"和"amount"都在"数据库字段"里。"组 #1名"在"组名字段"里,不过这个字段会在创建组的时候自动添加,所以不需要自己拖放。"#RTotal0"字段在刚建好的"运行总计字段"里。"订购单号"和"合计"都是"工具箱"中的"文本对象"。
[图10]
11.因为格式要求,将[图10]中自动生成的Section2 (页眉)中的三个字段都删掉。
12.根据需要,添上页眉。在字段上右键设置一下文本格式,如,根据格式要求,合计后应是18,不是18.00。则可在#RTotal0上右键,把"系统默认数据格式"改成"-1123"。
[最终设计图]
13.运行看看效果
[效果图]
14.成功!
6、设置报表系统自动登录 摘自:http://blog.csdn.net/swebin/archive/2007/09/28/1805255.aspx
首先,为了登录方便,将数据库的用户名和密码先写到Web.config中:
<appSettings>
<add key="DBServerName" value="你的数据库服务器" />
<add key="DBUserID" value="sa" />
<add key="DBPassWord" value="UU1Tc3lzdGVt" />
</appSettings>
然后写个类来统一验证登录
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace BLL
{
public class LoginCrystalReport
{
public void Login( CrystalDecisions.CrystalReports.Engine.ReportDocument report)
{
string serverName=ConfigurationManager.AppSettings["DBServerName"];
string userId = ConfigurationManager.AppSettings["DBUserID"];
string passWord=ConfigurationManager.AppSettings["DBPassWord"];
//Set Database Logon to main report
foreach (CrystalDecisions.Shared.IConnectionInfo connection in report.DataSourceConnections)
{
if (connection.ServerName == serverName)
{
connection.SetLogon(userId, passWord);
}
}
//Set Database Logon to subreport
foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subreport in report.Subreports)
{
foreach (CrystalDecisions.Shared.IConnectionInfo connection in subreport.DataSourceConnections)
{
if (connection.ServerName == serverName)
{
connection.SetLogon(userId, passWord);
}
}
}
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/swebin/archive/2007/09/28/1805255.aspx
现在准备工作已经做好了,下面开始制作水晶报表.对于如何设计水晶报表我在这里就不讲了.
报表做好后,新建一个WEB页,先拖一个水晶报表查看器,再拖一个水晶报表数据源,这些在VS2005的工具箱中都有,然后将查看器的数据源设置成刚才拖进来的水晶报表数据源,再将水晶报表数据源的数据源设置成刚才完成好的报表,这时候切换到代码,开始编写代码:
Code
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
BLL.LoginCrystalReport logCR = new BLL.LoginCrystalReport();
logCR.Login(this.CrystalReportSource1.ReportDocument);
}
好了,现在就可以不输入登录了。
7、水晶报表自动补空行及格线(无分组版)转自:http://www.cnblogs.com/babyt/archive/2009/02/15/1391145.html
问题的提出:
一个带格线的清单类报表,假设有6行,我们设定的页面纸型能容纳5行,那么数据会分成两页。
第1页显示5行,占满1页,而第2页则只显示1行,后面是一片空白区域。
怎么能根据数据的多少,自动填满后面的空白区域呢?
如下图(第2页):
解决方法:
清单类的报表,要填充的是最后一页的剩余区域。我们以每页显示5行数据为例。
那么对于最后一页只有五种情况。
1:最后一页刚好有5条数据,不需要填充。
2:最后一页有4条,需要填充1个空行;有3条,需要填充2个空行;有2条,需要填充3个空行;有1条,需要填充4个空行。
以有1条数据为例子,最大加4个空行。于是,加上原来的数据行,那么详细资料节上应该有5个小节。
设计出来的模板如下:
将详细资料节拆分成5个节,最上面的一个放数据,设置为显示,其余的4个节全部抑制显示,我们用公式来控制它的显示与否
画线方法:在页眉和页脚画个框,框的下边沿紧贴在页眉的上边沿。
然后在每个详细资料节的上边沿下面都画一条横线。
字段间画竖线,注意竖线的下边的这个顶点要顶在页脚这个节的线上。
下面我们来控制显示,
以下公式使用Crystal语法
1:编辑“详细资料节b” (也就是第一个空白节,我在上面放了一个字段做标记,实际使用时不需要)抑制显示后面的公式
count({雇员.出生日期}) mod 5 表示最后一页上剩余的数目。这个值是0、1、2、3、4
0表示已经塞满,大于0表示需要填充
//
注意这2个and条件
//
1:count({雇员.出生日期}) mod 5>0 说明记录数不是5的倍数,也就是说需要补空行
//
对于这个节来说,只要需要补,就显示
//
2:onlastrecord 这个条件是“是否是最后一条记录”,说明这个节只出现在最后一条记录之后
//也就是会出现在最后一页上
if count({雇员.出生日期}) mod 5>0 and onlastrecord then
false //外面勾选了抑制显示,那么false的意思就是不抑制显示。也就是这个节在这个条件下会显示
else
true
那么好,只要count({雇员.出生日期}) mod 5 >0 ,那么这个空白节就显示了。
2:现在来设置“详细资料节c”,第2个空白节。因为第一个详细资料节b之前已经显示了。
那么这个节,将只出现在需要2个2个以上空白行的情况,也就是说,count({雇员.出生日期}) mod 5 的值需要是1、2、3
于是公式就变成了。
if count({雇员.出生日期}) mod 5>0 and count({雇员.出生日期}) mod 5 <=3
and onlastrecord then
false
else
true
继续,后面的“详细资料节d”,第3个空白节,将只出现在count({雇员.出生日期}) mod 5 的值需要是1、2的时候
于是,公式为
if
count({雇员.出生日期}) mod
5
>
0
and count({雇员.出生日期}) mod
5
<=
2
and onlastrecord then
false
else
true
继续, 后面的“详细资料节e”,第4个空白节,将只出现在count({雇员.出生日期}) mod 5 的值是1的时候
于是,公式为
if
count({雇员.出生日期}) mod
5=1
and onlastrecord then
false
else
true
好设置完毕。
如果是5以外但是数字,假设为N。
那么详细资料节就拆成N个,第一个放数据 ,后面的公式依次类推。
第1个空行条件为 :
if count({雇员.出生日期}) mod N >0 and onlastrecord then
第2个到倒数第2个空白节的公式为:
if count({雇员.出生日期}) mod N >0 and count({雇员.出生日期}) mod N <=(N-2) onlastrecord then
if count({雇员.出生日期}) mod N >0 and count({雇员.出生日期}) mod N <=(N-3) onlastrecord then
...
if count({雇员.出生日期}) mod N >0 and count({雇员.出生日期}) mod N <=2 onlastrecord then
最后一个空行公式为:
if count({雇员.出生日期}) mod 5=1 and onlastrecord then
...
这样设置好就可以了。
其他:
如何保证每行的行高是一样的?
首先做好第一行,然后在在节专家中拆出其余的行。新增的行比第一行都要矮。复制数据行上的一个字段。粘贴到下面的各行,此时行高会自动调整到这个字段的高度。
此处下载示例报表,带数据(CR XI R2独立版本)