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[0].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[0].Rows[0]["ReportName"].ToString() + " " + ds.Tables[0].Rows[0]["ReportDescription"].ToString();
 50                     for (int i = 0; i < ds.Tables[0].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;
100                    exportOpts.DestinationOptions = diskOpts;
101                    try
102                    {
103                        oRpt.Export();
104                        MessageBox.Show("导出excel成功!" + diskOpts.DiskFileName, "成功提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
105                       
106                    }
107                    catch (System.Exception err)
108                    {
109                        MessageBox.Show(err.Message, "错误提示:导出excel失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
110                    }
111                }
112             }
113         //核心
114         private void ReplaceExportButton()
115         {
116             //遍历crystalReportViewer1控件里的控件
117             foreach (object ctl in crystalReportViewer1.Controls)
118             {
119                 //取得控件名称
120                 string sControl = ctl.GetType().Name.ToString().ToLower();
121                 //取得工具条
122                 if (sControl == "toolstrip")
123                 {
124                     ToolStrip tab1 = (ToolStrip)ctl;
125                     //遍历工具条Item
126                     for (int i = 0; i <= tab1.Items.Count - 1; i++)
127                     {
128                         //MessageBox.Show(tab1.Items[i].ToolTipText);
129                         //如果是导出按钮
130                         if (tab1.Items[i].ToolTipText == "导出报表" || tab1.Items[i].ToolTipText == "Export Report")
131                         {
132                             //先创建一个ToolStripButton准备替代现有Button
133                             ToolStripButton tbutton = new ToolStripButton();
134                             //获取原导出按钮的按钮图片
135                             Image img1 = tab1.Items[i].Image;
136                             //移除原导出按钮
137                             //tab1.Items.Remove(tab1.Items[i]);
138                             //设置新button属性
139                             tbutton.Image = img1;
140                             tbutton.ToolTipText = "自定义导出Execl报表按钮";
141                             //在原位置上插入新Button
142                             tab1.Items.Insert(12,tbutton);                            
143 
144                             //绑定自定义事件
145                             tbutton.Click += new System.EventHandler(this.btnExportExcel_Click);
146                             break;
147                         }
148 
149                     }
150                 }
151 
152             }
153         }
154 
155 
156     }

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;
10         }
11 
12         private void ShowRPT2_Load(object sender, EventArgs e)
13         {
14             ShowForm form1 = System.Windows.Forms.Application.OpenForms["ShowForm"] as ShowForm;
15             TableLogOnInfo logOnInfo = new TableLogOnInfo();
16             CRAXDDRT.ParameterValues crPara = new CRAXDDRT.ParameterValues();
17             string strg = pParentWin.ReportPath + "\\" + pParentWin.ReportName;
18             System.Windows.Forms.Application.UseWaitCursor = true;
19             ApplicationClass applicationClass = new ApplicationClass();
20             CRAXDDRT.Report report = new  CRAXDDRT.Report();
21            
22             try
23             {
24                 report = applicationClass.OpenReport(strg, null);
25                 FileState = "YES";
26             }
27             catch (System.Exception err)
28             {
29                 FileState = "NO";
30                 MessageBox.Show(err.Message, "错误提示:读取报表文件错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
31 
32                 //return;
33 
34             }
35             if (FileState == "YES")
36             {
37                 logOnInfo.ConnectionInfo.ServerName = W1.LoadXmlFileValue("config.xml", "Sys", "HostName");
38                 logOnInfo.ConnectionInfo.DatabaseName = W1.LoadXmlFileValue("config.xml", "Sys", "DataBase");
39                 logOnInfo.ConnectionInfo.UserID = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "User"));
40                 logOnInfo.ConnectionInfo.Password = W1.Decrypt(W1.LoadXmlFileValue("config.xml", "Sys", "Password"));
41                 report.Database.Tables[1].SetLogOnInfo(logOnInfo.ConnectionInfo.ServerName, logOnInfo.ConnectionInfo.DatabaseName, logOnInfo.ConnectionInfo.UserID, logOnInfo.ConnectionInfo.Password);
42                 //建立.rpt文件与CryStalReportviewer文件之间的连接
43                 //参数
44                
45                 try
46                 {
47                     DataSet ds = new DataSet();
48                     string _strSql = "SELECT  P.*,RP.* FROM ReportParameter RP,Report P where RP.ReportName=P.ReportName AND P.ReportName=‘" + pParentWin.ReportName + "‘ order by RP.ID ";
49                     ds = W1.DS(_strSql, "Sys");
50                     //动态修WinForm的Text[Report表中ReportDescription]
51                     this.Text = this.Text + ds.Tables[0].Rows[0]["ReportName"].ToString() + " " + ds.Tables[0].Rows[0]["ReportDescription"].ToString();
52                     for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
53                     {
54                         report.ParameterFields.GetItemByName(ds.Tables[0].Rows[i]["ParaName"].ToString(), null).ClearCurrentValueAndRange();
55                         report.ParameterFields.GetItemByName(ds.Tables[0].Rows[i]["ParaName"].ToString(), null).AddCurrentValue(form1.str[i]);
56                        // report.ParameterFields[i].AddCurrentValue(form1.str[i]);
57 
58                     }
59                 }
60                 catch (System.Exception err)
61                 {
62                     FileState = "NO";
63                     MessageBox.Show(err.Message, "错误提示:读取报表参数错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
64                     //return;
65 
66                 }
67                
68                
69             }
70             axCrystalActiveXReportViewer1.ReportSource = report;
71             axCrystalActiveXReportViewer1.ViewReport();
72             System.Windows.Forms.Application.UseWaitCursor = false;
73         }
74 
75   
76 
77 
78     }

时间: 2024-11-05 18:30:51

Crystal Report在.net中的两种显示方式的相关文章

Linux中的两种link方式

Linux系统中包括两种链接方式:硬链接(hard link)和符号链接(symbolic link),其中符合链接就是所谓的软链接(soft link),那么两者之间到底有什么区别呢? inode 在Linux系统中,内核为每一个新创建的文件分配一个inode,每个文件都有一个惟一的inode,这里将inode简单理解成一个指针,它永远指向本文件的具体存储位置同时,文件属性保存在inode里,比如owner等.在访问文件时,inode被复制到内存,从而实现文件的快速访问.系统是通过inode来

MySQL中的两种临时表

MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表.这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭.这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除). 内部临时表 内部临时表是一种特殊轻量级

iOS中的两种主要架构及其优缺点

凡是程序的开发者,应该对程序的架构都不陌生.一个程序的架构的好坏对这个程序有着非常重要的作用.今天我们来看一下iOS开发中用要的两种主流的程序架构.这个过程中我们主要以例子的形式展开. 我们来看第一种架构:如下图所示: 这种程序的架构主要原理是创建了一个导航控制器来控制页面之间的切换.这种架构一般把主界面作为导航控制器的根视图控制器.在上图所求的程序架构中,主界面管理了四个界面:微信界面,发现界面,联系人界面,关于我界面.如果程序是第一次运行的时候,进入用户指引界面,然后进入登录界面,输入账户名

JavaScript中的两种事件流

JavaScript中的两种事件流 事件流描述的是从页面中接收事件的顺序.提出事件流概念的正是IE和Netscape,但是前者提出的是我们常用的事件冒泡流,而后者提出的是事件捕获流. 第一部分:事件冒泡 即事件开始由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档). 下面举一个简单的例子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&

Hibeernate中的两种分页方式

1. return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session s) throws HibernateException { Criteria c = s.createCriteria(AskOnline.class); c.add(Restrictions.eq("boardid", new Long(bid))); c.setFirs

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT is SELECT ID,UNAME from g_users where utype=2 and STATUS>-1; begin for c in TABLE_DEPT loop INSERT INTO G_KNOWDOCRIGHT(RID,DIRID,DOCID,USERID) VALUES(SYS

eclipse中的两种Jre 及 Jre与Jdk的区别

分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK,本文不做二者的区分),那么点击eclipse.exe就会报错说找不到JRE.此时可以安装一个JRE.或者直接把JRE目录拷贝到eclipse安装目录下. 在Eclipse的每个项目中可以为项目指定不同的JRE版本,比如A项目使用JDK1.4编译,B项目使用JDK1.5编译.这个JDK版本是和Ecl

R语言绘图技巧:在同一张中使用两种不同尺度

写文章过程中遇到了这个绘图问题,需要在曼哈顿图上添加多样性曲线,两者的尺度差别比较大,直接用lines函数进行添加,效果悲剧.强行将尺度差距大的两者画在同一图中,效果大概就是下面这个样子. 这个图不容易看出数据的比较差异来.为解决这个问题,可使用R plotrix包里的twood.plot函数,在同一张图中使用两种不同的尺度,函数描述如下: 使用这个函数之后,再来画图: 无视色彩搭配和审美问题,至少比前面的图要直观一些了,两种信息的联系也能看的比较清晰. 最后放上代码~~~ ##########

validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符

//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblank = /^\S*$/; return this.optional(element) ||(pwdblank.test(value)); }, "密码不可包含空格"); //用户名必须需包含数字和大小写字母中至少两种 jQuery.validator.addMethod("use