水晶报表动态加载字段

原创 2007年08月31日 17:30:00
 

转:

水晶报表中动态加载报表字段

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using CrystalDecisions.CrystalReports.Engine;

using CrystalDecisions.Shared;

using System.Globalization;

 

namespace WEB2003Test.CryStalReportTest

{

     /// <summary>

     /// DynamicReportCommon 的摘要说明。

     /// </summary>

     public class DynamicReportCommon : System.Web.UI.Page

     {

         protected CrystalDecisions.Web.CrystalReportViewer crvEmployees;

         protected DataSet ds;

    

         private void Page_Load(object sender, System.EventArgs e)

         {

              // 在此处放置用户代码以初始化页面

              try

              {

                   if(!Page.IsPostBack)

                   {

                       if(Session["DynamicReportData"]!=null)

                       {

                            ds = (DataSet)Session["DynamicReportData"];   

                            Session.Remove("DynamicReportData");                                  //释放Session中的值

                            Page.Cache["Data"]=ds;                                                     //页面缓存报表导出打印时重新绑定报表用

                            string tableName = ds.Tables[0].TableName;                                 //DataSet表名

                            string [] strDescription = new string[ds.Tables[0].Columns.Count];    //存放标头的字符串数

                            this.GetTableNameAndeColName(ds,tableName,strDescription);            //获取表名及列名

                            CrystalDecisions.CrystalReports.Engine.ReportDocument cryDocument = new TextDynamicReport();

                            this.NoLineBoundReport(ds,strDescription,tableName,cryDocument,this.crvEmployees,18);

                       }

                       else

                       {

                            if(Page.Request.QueryString["ReturnUrl"]!=null)

                            {

                                 Response.Redirect(Page.Request.QueryString["ReturnUrl"].ToString());

                            }

                            else

                            {

                                 this.PrintStr("没有数据信息,报表加载失败!");

                            }

                       }

                   }

                   else               //这一部分应该自定义

                   {

                       ds = (DataSet)Page.Cache["Data"];   

                       string tableName = ds.Tables[0].TableName;                                 //DataSet表名

                       string [] strDescription = new string[ds.Tables[0].Columns.Count];    //存放标头的字符串数

                       this.GetTableNameAndeColName(ds,tableName,strDescription);            //获取表名及列名

                       CrystalDecisions.CrystalReports.Engine.ReportDocument cryDocument = new TextDynamicReport();

                       this.NoLineBoundReport(ds,strDescription,tableName,cryDocument,this.crvEmployees,18);

                   }

              }

              catch(Exception ee)

              {

                   this.PrintStr(ee.Message);

                  Server.ClearError();

              }

        

 

         }

         /// <summary>

         /// 报表绑定

         /// </summary>

         /// <param name="ds">要绑定的数据集</param>

         /// <param name="titleArray">要绑定的字段</param>

         /// <param name="tableName">绑定的表名</param></param>

         /// <param name="cryDocument">绑定的报表对象</param>

         /// <param name="cryDocument">显示的报表对象</param>

         /// <param name="cryDocument">合计的报表列数(注所有列的下划线条从Line11开始递增命名) 行的下划线以(Line1、Line2、Line3命名)</param>

         private void NoLineBoundReport(DataSet ds, string [] titleArray, string tableName,ReportDocument cryDocument,CrystalDecisions.Web.CrystalReportViewer crvEmployees,int totalColoums)

         {

              try

              {

                  

                   CrystalDecisions.Shared.ParameterFields parFields = new ParameterFields();     //参数字段集合

                   CrystalDecisions.Shared.ParameterField parField;                                    //参数字段

                   CrystalDecisions.Shared.ParameterDiscreteValue parDescrete;                         //用于参数字段付值

                   CrystalDecisions.CrystalReports.Engine.LineObject line;                             //用于报表Line对像

                   CrystalDecisions.CrystalReports.Engine.TextObject textBox;                          //用于报表TextBox

 

                   int [] coloumLength = new int[ds.Tables[tableName].Columns.Count];                  //存放参数及公式字段长度的数组

                   int intPostions =0;

                   DataTable dataTable = FillDataTableForDataSet(ds,tableName,titleArray,coloumLength);     //这部分要改进

                  

                   this.GetPosition(coloumLength);

                   for(int i=0; i<titleArray.Length; i++)         //设置字段值

                   {

                       textBox = cryDocument.ReportDefinition.ReportObjects["txt" + (i+1)] as TextObject;

                       textBox.Text = " " + titleArray[i];

                       cryDocument.DataDefinition.FormulaFields["Formula" + (i+1)].Text="{" + tableName + "." +titleArray[i].Trim() + "}";

                   }

                   parField = new ParameterField();

                   parField.ParameterFieldName = "ReportTitle";

                   parDescrete = new ParameterDiscreteValue();

                   parDescrete.Value = tableName;

                   parField.CurrentValues.Add(parDescrete);

                   parField.AllowCustomValues = false; 

                   parFields.Add(parField);

                   crvEmployees.ParameterFieldInfo = parFields;

                   intPostions =0;

                   for(int i=0; i<titleArray.Length; i++)         //设置报表对像位置

                   {

                       if(i==0)

                       {

                            cryDocument.ReportDefinition.ReportObjects["Formula" + (i+1)].Left=30;

                            intPostions=30;

                            textBox = cryDocument.ReportDefinition.ReportObjects["txt" + (i+1)] as TextObject;

                            textBox.Left=30;

                            textBox.Border.RightLineStyle = LineStyle.SingleLine;

                            textBox.Width = coloumLength[i];

                       }

                       else

                       {

                            intPostions += coloumLength[i-1];

                            cryDocument.ReportDefinition.ReportObjects["Formula" + (i+1)].Left=intPostions;

                            textBox = cryDocument.ReportDefinition.ReportObjects["txt" + (i+1)] as TextObject;

                            textBox.Left=intPostions;

                            textBox.Border.RightLineStyle = LineStyle.SingleLine;

                            textBox.Width = coloumLength[i];

                       }

                       cryDocument.ReportDefinition.ReportObjects["Formula" + (i+1)].Width=coloumLength[i];

                       cryDocument.ReportDefinition.ReportObjects["Formula" + (i+1)].Border.LeftLineStyle=LineStyle.NoLine;

                       cryDocument.ReportDefinition.ReportObjects["Formula" + (i+1)].Border.TopLineStyle=LineStyle.NoLine;

                       cryDocument.ReportDefinition.ReportObjects["Formula" + (i+1)].Border.BottomLineStyle=LineStyle.NoLine;

                   }

                   intPostions += coloumLength[coloumLength.Length-1];

 

                  

                   for(int i=1;i<4;i++)

                   {

                       line = cryDocument.ReportDefinition.ReportObjects["Line"+i] as LineObject;

                       line.Right = intPostions;

                   }

                  

                   cryDocument.SetDataSource(dataTable);

                   crvEmployees.ReportSource = cryDocument;

                   crvEmployees.DisplayGroupTree = true;

                   crvEmployees.DataBind();

                   ds.Dispose();

              }

              catch(Exception ee)

              {

                   this.PrintStr(@""+ ee.Message+"");

                   Server.ClearError();

              }

         }

 

 

        

         /// <summary>

         /// 自动将DataSet中的数据转换成字符串同进获取其数据类型的长度

         /// </summary>

         /// <param name="ds">数据源DataSet</param>

         /// <param name="tableName">表名</param>

         /// <param name="columnsName">列名数组</param>

         /// <param name="columnsLength">输出参数列长度数组</param>

         /// <returns>DataTable</returns>

         private DataTable FillDataTableForDataSet(DataSet ds,string tableName,string [] columnsName,int []columnsLength)

         {

              if(ds.Tables[tableName].Columns.Count!=columnsName.Length||columnsName.Length!=columnsLength.Length||ds.Tables[tableName].Columns.Count!=columnsLength.Length)    //传入的参数长度不一致时返回空值

              {

                   return null;

              }

 

              DataTable dataTable = new DataTable(tableName);

              System.Data.DataColumn column;                                                                             //要新建的表列对象

              System.Data.DataRow row;

        

 

              for(int i=0; i<columnsName.Length; i++)                                                                    //创建数据表

              {

                   column = new DataColumn(columnsName[i].Trim(),System.Type.GetType("System.String"));

                   columnsLength[i] = ds.Tables[tableName].Columns[columnsName[i]].MaxLength;

                   dataTable.Columns.Add(column);

              }

              for(int i=0; i<ds.Tables[tableName].Rows.Count; i++)

              {

                   row = dataTable.NewRow();

                   for(int j=0; j<columnsName.Length; j++)

                   {

                       if(ds.Tables[tableName].Rows[i][columnsName[j]].GetType().FullName == "System.DateTime")

                       {

                            row[columnsName[j]] =  this.GetStringForDataTime(ds.Tables[tableName].Rows[i][columnsName[j]]);//将时间类型的转换为为-06-05这样的格式

                       }

                       else if(ds.Tables[tableName].Rows[i][columnsName[j]].GetType().FullName == "System.Double")

                       {

                            row[columnsName[j]] = this.GetStringForDouble(ds.Tables[tableName].Rows[i][columnsName[j]]);//将小数转换为只带两位小数的格式

                       }

                       else if(ds.Tables[tableName].Rows[i][columnsName[j]].GetType().FullName == "System.DBNull")

                       {

                            row[columnsName[j]] = "  "+((char)6);

                       }

                       else

                       {

                            row[columnsName[j]] = this.Getstring(ds.Tables[tableName].Rows[i][columnsName[j]]);

                       }

                       //row[columnsName[j]] =ds.Tables[tableName].Rows[i][columnsName[j]];

                       if(columnsLength[j]<row[columnsName[j]].ToString().Length)

                       {

                            columnsLength[j]=row[columnsName[j]].ToString().Length;

                           

                       }

                   }

                   dataTable.Rows.Add(row);

              }

              return dataTable;

         }

 

         /// <summary>

         /// 将日期类型转化为-06-12形式的字符串

         /// </summary>

         /// <param name="var">要转换的对象</param>

         /// <returns返回的字符串</returns>

         private string GetStringForDataTime(object var)

         {

              try

              {

                   return "" + Convert.ToDateTime(var).ToString("yyyy-MM-dd");

              }

              catch

              {

                   return "";

              }

         }

 

         /// <summary>

         /// 将Double类型的数据转化成两们小数的字符串

         /// </summary>

         /// <param name="var">要转换的字符串</param>

         /// <returns>返回的字符串</returns>

         private string GetStringForDouble(object var)

         {

              System.Globalization.NumberFormatInfo doubleNfi = new CultureInfo("en-US",false).NumberFormat;    //小数字符串保留两位小数

              doubleNfi.NumberDecimalDigits = 2;

 

              try

              {

                   return "" + Convert.ToString(var).ToString(doubleNfi);

              }

              catch

              {

                   return "";

              }

         }

 

         /// <summary>

         /// 字符串转换

         /// </summary>

         /// <param name="var">要装换的对象</param>

         /// <returns>返回的字符串</returns>

         private string Getstring(object var)

         {

              try

              {

                   return "" + Convert.ToString(var);

              }

              catch

              {

                   return "";

              }

         }

        

         /// <summary>

         /// 将Double型字符串转换成Int型字符串

         /// </summary>

         /// <param name="var"></param>

         /// <returns></returns>

         private int GetIntForDouble(object var)

         {

              try

              {

                   return Convert.ToInt32(var);

              }

              catch

              {

                   return 0;

              }

         }

 

         /// <summary>

         /// 获取报表对象启始坐标位置

         /// </summary>

         /// <param name="coloumLength"></param>

         private void GetPosition(int [] coloumLength)

         {

              int totalLength = 0;

              int [] temp = new int[coloumLength.Length];

 

              for(int i=0; i<coloumLength.Length; i++)

              {

                   totalLength +=coloumLength[i];

                   temp[i]=coloumLength[i];

              }

              if(totalLength==0)

              {

                   return;

              }

              for(int i=0; i<coloumLength.Length; i++)

              {

                   coloumLength[i] = this.GetIntForDouble(temp[i]*11260/totalLength);

              }

 

         }

 

         /// <summary>

         /// 弹出提示窗口

         /// </summary>

         /// <param name="Message">提示信息</param>

         private void PrintStr(string Message)

         {

              System.Text.RegularExpressions.Regex digitregex = new System.Text.RegularExpressions.Regex("[']");

              Message = digitregex.Replace(Message,"’");

              Page.RegisterStartupScript(new Random().Next(1000000).ToString(), "<script>alert('" + Message + "');</script>");

         }

 

         /// <summary>

         /// 根据DataSet获取表名及字段名数组

          /// </summary>

         /// <param name="ds"></param>

         /// <param name="tableName"></param>

         /// <param name="columnsNames"></param>

         private void GetTableNameAndeColName(DataSet ds,string tableName,string[]columnsNames)

         {

              for(int i=0; i<ds.Tables[tableName].Columns.Count; i++)

              {

                   columnsNames[i] = ds.Tables[tableName].Columns[i].ColumnName.ToString();

              }

         }

         #region Web 窗体设计器生成的代码

         override protected void OnInit(EventArgs e)

         {

              //

              // CODEGEN: 该调用是ASP.NET Web 窗体设计器所必需的。

              //

              InitializeComponent();

              base.OnInit(e);

         }

        

         /// <summary>

         /// 设计器支持所需的方法- 不要使用代码编辑器修改

         /// 此方法的内容。

         /// </summary>

         private void InitializeComponent()

         {   

              this.Load += new System.EventHandler(this.Page_Load);

 

         }

         #endregion

     }

}

相关文章推荐

DevExpress之XtraReport 学习笔记

XtraReport 一、基本概念: XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示(这种情况更常见)。 因此,每个报表都作为带区的容器使用...
  • ful1021
  • ful1021
  • 2014年07月28日 11:13
  • 10682

水晶报表动态加载磁盘图片

1、首先,我们先创建一个DataSet.xsd文件,如下图所示,这是一个表 2、查看此表的代码,注意字段LIMG的数据类型为base64Binary。...

【水晶报表之图片篇-c】 CR 11版本动态加载的另一种简单方案

2005年我在《水晶报表中如何动态加载图片(图片文件版本及数据库版本)》 提供的方法中,用了编程的方法,虽然也实现了,但是比较繁琐 地址: http://www.cnblogs.com/baby...

水晶报表中如何动态加载图片(图片文件版本及数据库版本)

Step1:数据库文件版本 如果你在数据库中采用了二进制字段存储图片文件 微软 Access 里这些字段叫作 OLE 字段,而Oracle和SQL Server把它们称作 BLOB (二进...

水晶报表动态创建字段

  • 2012年11月11日 01:02
  • 642KB
  • 下载

水晶报表动态字段方法

  • 2011年04月26日 09:06
  • 642KB
  • 下载

如何设置水晶报表(crystal reports)的字段自动换行

1.如何设置水晶报表(crystal reports)的字段自动换行水晶报表从数据库中读取的数据,当字段内容比较长时,很影响美观,需要设置它为自动换行来显示。影响美观的没有自动换行的报表图示: OK,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:水晶报表动态加载字段
举报原因:
原因补充:

(最多只允许输入30个字)