`
isiqi
  • 浏览: 16485150 次
  • 性别: 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#中动态加载水晶报表自定义字段需要遵循一定的步骤,包括创建报表模版、添加记录集、添加参数字段、将参数字段和数据库字段放入水晶报表内、编写代码等。同时,自定义字段的实现方法包括使用报表引擎的API、使用...

    水晶报表动态字段方法

    【水晶报表动态字段方法】是指在设计Crystal Reports时,根据用户的需求,能够在运行时动态地添加或显示不同的字段。这种方法通常用于处理不确定的或可变的数据结构,例如当报表的列数或列名需要根据用户输入或外部...

    水晶报表动态创建字段

    【水晶报表动态创建字段】是报表设计中的一种高级技巧,主要应用于那些字段数量不固定,需要根据业务需求动态调整的情况。下面将详细讲解如何实现这一功能。 首先,我们需要创建一个水晶报表模板。在Crystal ...

    水晶报表动态显示图片

    在水晶报表中动态显示图片是一项重要的功能,这使得报告更加生动且具有更高的信息传达效率。 在水晶报表中动态显示图片,通常涉及到以下几个关键知识点: 1. **数据链接**:水晶报表可以将图片存储在数据库中或者...

    水晶报表自定义报表字段源码

    4. **报表设计集成**:在水晶报表设计环境中,自定义字段需要能够像内置字段一样被添加、编辑和布局。这就需要在代码中注册自定义字段类,并确保其能在设计视图中正确显示和操作。 5. **运行时行为**:在报表运行时...

    水晶报表实现加载多幅图片

    本项目主要探讨如何在水晶报表中实现加载多幅图片,并涉及图片的存储和读取。以下将详细讲解这一过程中的关键知识点。 首先,我们要理解水晶报表的基本架构。水晶报表允许用户通过设计界面来构建复杂的报表结构,...

    VB.net 水晶报表 动态数据源

    在VB.NET中,也可以在代码中动态地添加和修改分组。 5. **动态参数** 动态参数允许用户在运行时选择报告的条件或过滤器。这些参数可以在报表设计时创建,并在VB.NET代码中设置其默认值或可用选项。例如,可以创建...

    如何直接动态加载水晶报表文件

    在本教程中,我们将探讨如何直接动态加载水晶报表文件,以便根据需要灵活地展示数据。 首先,我们需要了解水晶报表的基本工作原理。水晶报表基于数据源,可以是数据库、XML文件、Excel表格等。报表设计时,我们通过...

    vb6.0水晶报表的制作学习资料

    在VB6.0代码中,你可以控制水晶报表的行为,比如加载数据源、设置参数值、打印报表或导出为其他格式(如PDF、Excel等)。这通常涉及水晶报表的类,如CrystalReport1,以及它的方法和属性。 调试和测试。完成报表...

    C#动态水晶报表

    在IT行业中,报表系统是企业数据可视化和决策支持的关键组件,而水晶报表(Crystal Reports)作为一款强大的报表设计工具,广泛应用于.NET Framework环境,特别是与C#结合时,能够帮助开发者创建复杂的业务报告。...

    水晶报表的动态添加和删除

    本问题探讨了如何在水晶报表中实现动态添加和删除字段,以便适应不同的数据表结构,从而提高报表的通用性。 首先,要解决的关键在于如何创建一个通用报表文件,该文件能在运行时根据实际数据集(dataset)的结构...

    水晶报表 实现列的动态增加

    2. **创建数据视图**:在水晶报表中,你可以使用“字段浏览器”来添加数据源中的字段到报表。然而,对于动态列,你需要创建一个数据视图(DataSet)或者数据表(DataTable),并在代码中动态地添加或删除列。这通常...

    水晶报表交叉报表设计

    在视频教程“水晶报表交叉表设计.avi”中,很可能会演示以上提到的步骤,包括数据源的连接、字段的布局、分组和汇总的设置,以及自定义功能的运用。通过观看和实践这个视频,你将能够熟练掌握水晶报表的交叉报表设计...

    水晶报表二维码,code128,Ean-13

    在水晶报表中,添加二维码功能可以使报告更加互动和实用,比如,通过扫描二维码直接访问网页或触发特定的操作。 Code128条形码是一种高密度的条形码标准,能够编码所有的128个ASCII字符,包括数字、字母和特殊字符...

    如何在水晶报表中过滤数据

    在水晶报表中过滤数据是一项基本但至关重要的技能,它允许用户根据特定条件筛选出所需的信息,以满足不同的业务需求。下面将详细介绍如何在水晶报表中进行数据过滤,并提供相关的实践步骤。 1. **创建水晶报表** ...

    winform中 水晶报表打印功能

    使用水晶报表的数据源对话框,可以设置连接字符串,选择表或视图,然后将字段拖放到报表设计界面中。对于文本框输入的数据,我们可以创建一个临时数据集,将文本框内容添加到数据集中,然后将此数据集作为报表的数据...

    水晶报表中文手册

    同时,水晶报表支持条件格式化,允许根据数据值动态改变单元格的样式,这在呈现数据差异和趋势时尤为有用。 水晶报表还具备强大的分组和排序功能。用户可以基于数据字段对报表内容进行分组,并为每个组设置不同的...

    条形码如何用在水晶报表中

    在水晶报表中,可以使用公式来动态生成条形码。具体做法是: - 创建一个文本框,并设置其内容为公式:`*+{Table.BarcodeField}+*`。其中,`{Table.BarcodeField}`是存储条形码数据的字段名,前后各加一个星号(`*`)是...

    在水晶报表中使用Access数据库

    水晶报表中的每个元素都必须与数据源字段绑定,确保数据显示正确。可以通过“字段浏览器”窗口查看和选择数据库字段。 7. 分页和导出: 水晶报表支持自动分页,可以设定每页显示的记录数。此外,报表可以导出为...

Global site tag (gtag.js) - Google Analytics