`
isiqi
  • 浏览: 15946150 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

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

}

}

分享到:
评论

相关推荐

    c#中动态加载水晶报表自定义字段

    c#中动态加载水晶报表自定义字段

    15个Crystal Report 报表编程的实例

    6 如何在水晶报表中添加合计字段 7 如何在水晶报表中制作数据图表 8 如何在水晶报表中使用计算公式 9 如何在水晶报表中制作超级链接 10 如何在水晶报表中显示比例数据 11 如何在水晶报表中实现邮件列表 12 如何在...

    水晶报表从入门到精通

    第一部分 报表编写基础 第1章 创建一个报表 第2章 修改报表 第3章 格式化字段和对象 第二部分 使报表元素...第11章 在水晶报表中使用SQL 第12章 可视化分析数据 第13章 报表模版 第14章 报表引擎处理模型 。。。。。

    C# 打印与报表技术 源码

    如何报表数据分组  如何报表中筛选数据  如何对分组报表中的页码进行设置  报表的应用技巧  如何在水晶报表中使用交叉表  如何在水晶报表中使用子报表  如何动态显示子报表  如何...

    Crystal Reports 2008 水晶报表官方中文傻瓜教程(翻译).pdf

    4.4.1 选择报表类型及数据源.................................83 4.4.2 在“设计”选项卡上处理报表元素.......................84 4.4.3 使用其他报表功能.....................................86 第 5 章报表...

    Anycell Report 中国式报表控件2011 2.45.008.rar

    可拖动对象功能增强(现在AC不仅可以支持强大的表格功能,也可以使用AC Report 像传统的报表工具例如FastReport或水晶报表那样设计报表了)。  2.在新建页面时,增加了“数据模块”类型,用来存放报表中的数据控件...

    C#开发经验技巧宝典

    0997 如何设置水晶报表中节的背景图片 583 0998 如何设置水晶报表中节的背景色 584 0999 如何设置水晶报表的页面 584 1000 如何在报表中添加节 584 1001 如何在报表中移动节的顺序 585 1002 如何在报表中...

    ACReport中国式报表控件2011(Ver2.42)

    1.可拖动对象功能增强(现在AC不仅可以支持强大的表格功能,也可以使用AC Report 像传统的报表工具例如FastReport或水晶报表那样设计报表了) 2.在新建页面时,增加了“数据模块”类型,用来存放报表中的数据控件,...

    Visual C# 2008程序设计经典案例设计与实现

    案例7 利用水晶报表分组统计数据库中的数据 案例8 利用水晶报表筛选数据库中的数据 案例9 图表在水晶报表中的应用 本章小结 第7章 Visual C#2008与Windows系统设置 案例1 任务栏的显示与隐藏 案例2 开始按钮的...

    C# 源码 C#2008经典案例

    案例7 利用水晶报表分组统计数据库中的数据 案例8 利用水晶报表筛选数据库中的数据 案例9 图表在水晶报表中的应用 本章小结 第7章 VisualC#2008与Windows系统设置 案例1 任务栏的显示与隐藏 案例2 开始按钮的显示与...

    C#设计经典案例设计与实现

    案例7 利用水晶报表分组统计数据库中的数据 案例8 利用水晶报表筛选数据库中的数据 案例9 图表在水晶报表中的应用 本章小结 第7章 VisualC#2008与Windows系统设置 案例1 任务栏的显示与隐藏 案例2 开始按钮的显示与...

    Visual+C#+2008程序设计经典案例设计与实现.rar

    案例7 利用水晶报表分组统计数据库中的数据 案例8 利用水晶报表筛选数据库中的数据 案例9 图表在水晶报表中的应用 本章小结 第7章 VisualC#2008与Windows系统设置 案例1 任务栏的显示与隐藏 案例2 开始按钮的显示与...

    SAP BWBO实战指南像学习office一样学习.part5

    15.2 添加字段 15.3 写程序填充数据 15.4 设置数据源和数据抽取验证 第16章 一般数据源 16.1 数据库视图的创建 16.2 一般数据源的创建 16.3 GeneticDelta的设置 第17章 CO—PA数据源 17.1 CO.PA的原理 17.2...

    BW-《SAP BWBO实战指南像学习office一样学习》.part7

    15.2 添加字段 15.3 写程序填充数据 15.4 设置数据源和数据抽取验证 第16章 一般数据源 16.1 数据库视图的创建 16.2 一般数据源的创建 16.3 GeneticDelta的设置 第17章 CO—PA数据源 17.1 CO.PA的原理 17.2...

    BW-《SAP BWBO实战指南像学习office一样学习》.part8.

    15.2 添加字段 15.3 写程序填充数据 15.4 设置数据源和数据抽取验证 第16章 一般数据源 16.1 数据库视图的创建 16.2 一般数据源的创建 16.3 GeneticDelta的设置 第17章 CO—PA数据源 17.1 CO.PA的原理 17.2...

    BW-《SAP BWBO实战指南像学习office一样学习》.part6.

    15.2 添加字段 15.3 写程序填充数据 15.4 设置数据源和数据抽取验证 第16章 一般数据源 16.1 数据库视图的创建 16.2 一般数据源的创建 16.3 GeneticDelta的设置 第17章 CO—PA数据源 17.1 CO.PA的原理 17.2...

    BWBO实战指南像学习office一样学习 part4

    15.2 添加字段 15.3 写程序填充数据 15.4 设置数据源和数据抽取验证 第16章 一般数据源 16.1 数据库视图的创建 16.2 一般数据源的创建 16.3 GeneticDelta的设置 第17章 CO—PA数据源 17.1 CO.PA的原理 17.2...

Global site tag (gtag.js) - Google Analytics