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(); } } Web 窗体设计器生成的代码#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 }}