Crystal Report在.net中的两种显示方式
Crystal Report在.net中的两种显示方式
编写人:CC阿爸
2014-7-29
近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一些小问题,无赖之下,仔细了解一下水晶报表的操作方法,逼苦我们这些苦逼的程序,虽说在以前的项目中,也常使用crystal report 来制作报表。并且针对web与winform 都各有不同的地方。
但总的来讲:显示水晶报表目前使用控件对象的有两种显示方式
1. 使用crystalReportViewer1 来显示报表
2. 使用Crystal ActiveX report viewer 来显示报表
在使用前,先废话一下有关水晶报表的一些版本的问题:
1. 我接触的第一个是7.0的版本。有一些vb程序的程序都在使用这个版本的报表
2. 后来使用上.net开发工具后,直接升到了crystal report 9.0。
3. Vs 2008 内置了10.5的水晶报表。但这个版本在官方是没有的。
因此我制作报表时仍使用的是为10.0
4. 后来水晶报表先后推出了11 2008,现到13,14
5. 最后想说的,这中间sap收购了水晶报表,现查找技术文档只能在sap网站上查找了。
接下来。废话就不多讲了,将我们使用的代码贴出来供大家参考,发扬互联网的共享精神。让苦逼的程序猿们也少走点冤枉路了。
开发环境:vs 2008+crystal report 10
使用crystalReportViewer1 来显示报表

1 public partial class ShowRPT : Form
2 {
3 private XOS.Admin.ShowForm pParentWin = null;
4 protected string FileState = "";
5 WinBase.Common W1 = new WinBase.Common();
6 //这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
7 ReportDocument oRpt = new ReportDocument();
8 public ShowRPT(XOS.Admin.ShowForm WinMain)
9 {
10 InitializeComponent();
11 pParentWin = WinMain;
12 }
13
14 private void ShowRPT_Load(object sender, EventArgs e)
15 {
16 ShowForm form1 = Application.OpenForms["ShowForm"] as ShowForm;
17 TableLogOnInfo logOnInfo = new TableLogOnInfo();
18 ReplaceExportButton();//新增一个工具栏自定义导出excel
19
20 try
21 {
22 string strg = pParentWin.ReportPath + "\\" + pParentWin.ReportName;
23 oRpt.Load(strg);
24 FileState = "YES";
25 }
26 catch (System.Exception err)
27 {
28 FileState = "NO";
29 MessageBox.Show(err.Message, "错误提示:读取报表文件错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
30
31 //return;
32
33 }
34 if (FileState == "YES")
35 {
36 logOnInfo.ConnectionInfo.ServerName = W1.LoadXmlFileValue("config.xml", "Sys", "HostName");
37 logOnInfo.ConnectionInfo.DatabaseName = W1.LoadXmlFileValue("config.xml", "Sys", "DataBase");
38 logOnInfo.ConnectionInfo.UserID = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "User"));
39 logOnInfo.ConnectionInfo.Password = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "Password"));
40 oRpt.Database.Tables[].ApplyLogOnInfo(logOnInfo);
41 //建立.rpt文件与CryStalReportviewer文件之间的连接
42 //参数
43 try
44 {
45 DataSet ds = new DataSet();
46 string _strSql = "SELECT P.*,RP.* FROM ReportParameter RP,Report P where RP.ReportName=P.ReportName AND P.ReportName='" + pParentWin.ReportName + "' order by RP.ID ";
47 ds = W1.DS(_strSql, "Sys");
48 //动态修WinForm的Text[Report表中ReportDescription]
49 this.Text = this.Text + ds.Tables[].Rows[]["ReportName"].ToString() + " " + ds.Tables[].Rows[]["ReportDescription"].ToString();
50 for (int i = ; i < ds.Tables[].Rows.Count; i++)
51 {
52 oRpt.SetParameterValue(i, form1.str[i]);
53
54 }
55 }
56 catch (System.Exception err)
57 {
58 FileState = "NO";
59 MessageBox.Show(err.Message, "错误提示:读取报表参数错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
60 //return;
61
62 }
63 ParameterFields parameterFields = crystalReportViewer1.ParameterFieldInfo;
64 crystalReportViewer1.ReportSource = oRpt;
65 crystalReportViewer1.ShowRefreshButton = false;
66
67 }
68 }
69
70 private void btnExportExcel_Click(object sender, EventArgs e)
71 {
72
73 // 声明变量并获取导出选项。
74 ExportOptions exportOpts = new ExportOptions();
75 ExcelFormatOptions excelFormatOpts = new ExcelFormatOptions();
76 DiskFileDestinationOptions diskOpts = new DiskFileDestinationOptions();
77 exportOpts = oRpt.ExportOptions;
78 // 设置 Excel 格式选项。
79 excelFormatOpts.ExcelUseConstantColumnWidth = true;
80 exportOpts.ExportFormatType = ExportFormatType.Excel;
81 exportOpts.FormatOptions = excelFormatOpts;
82
83 // 设置磁盘文件选项并导出。
84 exportOpts.ExportDestinationType = ExportDestinationType.DiskFile;
85 SaveFileDialog sf = new SaveFileDialog();
86 string FileName ="";
87 sf.Filter = "Microsoft Excel(*.xls)|*.xls" ;
88 // ……
89
90 /* sf.DefaultExt = "rtf";
91 * 这么设起不了作用,还不知道原因何在
92 * 所以只好手动调整顺序 */
93
94 //用sf.FilterIndex调整
95
96 if (DialogResult.OK == sf.ShowDialog())
97 {
98 FileName = sf.FileName;
99 diskOpts.DiskFileName = FileName;
exportOpts.DestinationOptions = diskOpts;
try
{
oRpt.Export();
MessageBox.Show("导出excel成功!" + diskOpts.DiskFileName, "成功提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (System.Exception err)
{
MessageBox.Show(err.Message, "错误提示:导出excel失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
//核心
private void ReplaceExportButton()
{
//遍历crystalReportViewer1控件里的控件
foreach (object ctl in crystalReportViewer1.Controls)
{
//取得控件名称
string sControl = ctl.GetType().Name.ToString().ToLower();
//取得工具条
if (sControl == "toolstrip")
{
ToolStrip tab1 = (ToolStrip)ctl;
//遍历工具条Item
for (int i = ; i <= tab1.Items.Count - ; i++)
{
//MessageBox.Show(tab1.Items[i].ToolTipText);
//如果是导出按钮
if (tab1.Items[i].ToolTipText == "导出报表" || tab1.Items[i].ToolTipText == "Export Report")
{
//先创建一个ToolStripButton准备替代现有Button
ToolStripButton tbutton = new ToolStripButton();
//获取原导出按钮的按钮图片
Image img1 = tab1.Items[i].Image;
//移除原导出按钮
//tab1.Items.Remove(tab1.Items[i]);
//设置新button属性
tbutton.Image = img1;
tbutton.ToolTipText = "自定义导出Execl报表按钮";
//在原位置上插入新Button
tab1.Items.Insert(,tbutton);
//绑定自定义事件
tbutton.Click += new System.EventHandler(this.btnExportExcel_Click);
break;
}
}
}
}
}
}

1 public partial class ShowRPT2 : Form
2 {
3 private XOS.Admin.ShowForm pParentWin = null;
4 protected string FileState = "";
5 WinBase.Common W1 = new WinBase.Common();
6 public ShowRPT2(XOS.Admin.ShowForm WinMain)
7 {
8 InitializeComponent();
9 pParentWin = WinMain;
}
private void ShowRPT2_Load(object sender, EventArgs e)
{
ShowForm form1 = System.Windows.Forms.Application.OpenForms["ShowForm"] as ShowForm;
TableLogOnInfo logOnInfo = new TableLogOnInfo();
CRAXDDRT.ParameterValues crPara = new CRAXDDRT.ParameterValues();
string strg = pParentWin.ReportPath + "\\" + pParentWin.ReportName;
System.Windows.Forms.Application.UseWaitCursor = true;
ApplicationClass applicationClass = new ApplicationClass();
CRAXDDRT.Report report = new CRAXDDRT.Report();
try
{
report = applicationClass.OpenReport(strg, null);
FileState = "YES";
}
catch (System.Exception err)
{
FileState = "NO";
MessageBox.Show(err.Message, "错误提示:读取报表文件错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
//return;
}
if (FileState == "YES")
{
logOnInfo.ConnectionInfo.ServerName = W1.LoadXmlFileValue("config.xml", "Sys", "HostName");
logOnInfo.ConnectionInfo.DatabaseName = W1.LoadXmlFileValue("config.xml", "Sys", "DataBase");
logOnInfo.ConnectionInfo.UserID = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "User"));
logOnInfo.ConnectionInfo.Password = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "Password"));
report.Database.Tables[].SetLogOnInfo(logOnInfo.ConnectionInfo.ServerName, logOnInfo.ConnectionInfo.DatabaseName, logOnInfo.ConnectionInfo.UserID, logOnInfo.ConnectionInfo.Password);
//建立.rpt文件与CryStalReportviewer文件之间的连接
//参数
try
{
DataSet ds = new DataSet();
string _strSql = "SELECT P.*,RP.* FROM ReportParameter RP,Report P where RP.ReportName=P.ReportName AND P.ReportName='" + pParentWin.ReportName + "' order by RP.ID ";
ds = W1.DS(_strSql, "Sys");
//动态修WinForm的Text[Report表中ReportDescription]
this.Text = this.Text + ds.Tables[].Rows[]["ReportName"].ToString() + " " + ds.Tables[].Rows[]["ReportDescription"].ToString();
for (int i = ; i < ds.Tables[].Rows.Count; i++)
{
report.ParameterFields.GetItemByName(ds.Tables[].Rows[i]["ParaName"].ToString(), null).ClearCurrentValueAndRange();
report.ParameterFields.GetItemByName(ds.Tables[].Rows[i]["ParaName"].ToString(), null).AddCurrentValue(form1.str[i]);
// report.ParameterFields[i].AddCurrentValue(form1.str[i]);
}
}
catch (System.Exception err)
{
FileState = "NO";
MessageBox.Show(err.Message, "错误提示:读取报表参数错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
//return;
}
}
axCrystalActiveXReportViewer1.ReportSource = report;
axCrystalActiveXReportViewer1.ViewReport();
System.Windows.Forms.Application.UseWaitCursor = false;
}
}
Crystal Report在.net中的两种显示方式的更多相关文章
- MySQL中的两种临时表
MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符
//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...
- C#中的两种debug方法
这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下 第一种:需要把调试方法改成debug代码用 #if DEBU ...
- eclipse中的两种Jre 及 Jre与Jdk的区别
分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK ...
- 在netty3.x中存在两种线程:boss线程和worker线程。
在netty 3.x 中存在两种线程:boss线程和worker线程.
- JavaScript中的两种全局对象
这里总结的东西特别适合先学习c/c++, Java这类标准语言再学JS的童鞋们看,因为JS在程序执行之前就会初始化一个全局对象,这个全局对象到底是什么是跟JS程序运行环境有关的. 根据JavaScri ...
- Java中的两种异常类型及其区别?
Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...
随机推荐
- [ActionScript 3.0] AS3 深入理解Flash的安全沙箱Security Domains
简介 如果你还没有与复杂的的安全域(security domain)和应用程序域(application domain)问题打过交道,那么你真是个幸运的家伙.当你在加载外部内容(然后他们开始播放)的时 ...
- crm 4 注释与上传附件权限
文档注释权限及上传附件是与实体的”追加到”权限有关. 文档注释权限及上传附件是与核心记录中”注释”的”追加”权限有关. 追加及追加到的权限,我的理解是与本实体有关联的实体的权限,比如你引用了其它表的字 ...
- sql如何获取一个时间段内的月份
),) from master..spt_values where type='P' and dateadd(month,number,'2010-01-01')<='2010-09-01' / ...
- C++primer 练习10.16
// 10.3.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- java类总结
1.java类与类之间存在六种关系:继承,实现,依赖,关联,聚合组成 2.一个类可以继承另外一个类,并在此基础上添加自己的特有的功能. 3.一个类的方法中操作另外一个类的对象,这种情况称为第一个类依赖 ...
- Oracle索引HINT的使用
存储在数据库中数据的分布情况开发人员或管理员比Oracle优化器更加的清楚,在优化器不能作出最有查询路径选择的情况下,使用HINT(提示)人为的固定查询路径,一定程度能生成更优的执行计划. ...
- 通过WebHandler给图片添加水印
图片生成webhandler水印,主要把水印的信息和位置post到webhandler去处理,返回后再div上显示 前台传递水印的信息和位置: /***********提取DIV属性********* ...
- FileZilla - Windows XP经典软件系列
官网: https://filezilla-project.org/ 下载: http://sourceforge.net/projects/filezilla/ 版本:V3.9.0.1 (支持XP最 ...
- Win2D 官方文章系列翻译 - 避免内存泄漏
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-avoiding-memory-leaks/ 在托管 XAML 应用中使用 Win2D 控件时,必须谨慎处理对 ...
- Flex 仿Winxp左侧菜单
呆毛放出,源码暂时不能公布,一直比较喜欢winxp的左侧菜单样式,以前也用xslt实现过,但总是达不到完美,没想到FLex轻松做到了这一点,几乎和winxp一模一样.