水晶报表动态加载字段

 

转:

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

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

     }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值