1,水晶報表從資料庫中讀取的資料,當欄位內容比較長時,很影響美觀,需要設定它為自動換行來顯示。
2.開啟欄位的“設定對象格式”屬性,將其“公用”標籤下的“可以擴大屬性選上,*該設定可以使邊框自適應寬度
3.開啟節專家,將詳細資料中的“延伸到後續節”選中,如果有多個節點的話可以把多個節點全部選中;
4.將報表中線條控制項的“設定對象格式”中“列印時擴充到節的底部”屬性勾選上,這樣線條也會根據每行的資料高度自動向下移動。
1,建立dataset.xsd 增加表,然後在表中增加若干列
2,增加水晶報表,畫表格,將dataset中的列顯示到水晶報表中,並增加參數,(p1.p2.p3.p4.p5)
3 通過代碼將datatable轉換為xml,dataset
using CrystalDecisions.CrystalReports.Engine;using DbHelper;using Productsys;using System;using System.Data;using System.Data.OleDb;using System.Windows.Forms;class clsDyCrystalReportCore{ /// <summary> /// 將傳入的datatable轉換成報表範本所需要的datatable /// 資料全部轉換為string /// </summary> /// <param name="dt">來源表</param> /// <returns>報表範本所需要的datatable</returns> public DataTable dtx(DataTable dt) { BigTable.TableModeDataTable dtx1 = new BigTable.TableModeDataTable(); object[] obj = new object[dt.Columns.Count]; //特別注意:所選擇的表的列的數目需<=Bigtable的欄位數目 //請自行填防寫保護代碼 for (int i = 0; i < dt.Rows.Count; i++) { dtx1.Rows.Add(dtx1.NewRow()); for (int j = 0; j < dt.Columns.Count; j++) { dtx1.Rows[i][j] = dt.Rows[i][j].ToString(); } } return dtx1; } /// <summary> /// 擷取ReportDocument /// 使用擷取到的對象對Reportview設定 /// crystalReportViewer1.ReportSource = myReport; /// crystalReportViewer1.RefreshReport(); /// /// </summary> /// <param name="titile">表標題</param> /// <param name="dtSource">資料來源</param> /// <returns></returns> public ReportDocument getReportSource(string titile, DataTable dtSource) { DataTable dt1 = dtSource; DataTable dtx = new DataTable(); //處理ds1 clsDyCrystalReportCore xCore = new clsDyCrystalReportCore(); dtx = xCore.dtx(dt1); ReportDocument myReport = new ReportDocument(); string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + @"/Resource/TimeReport.rpt"; myReport.Load(reportPath); //綁定資料集,注意,一個報表用一個資料集。 myReport.SetDataSource(dtx); //擷取列數 int cols = dt1.Columns.Count; if (cols >= 9) { //設定參數,即表頭 for (int i = 1; i <= cols; i++) { if (i <= cols) //dt1.Columns[i-1].ColumnName myReport.SetParameterValue("p" + i.ToString(), dt1.Columns[i - 1].ColumnName); else //注意,這個不能省,一定要給沒用到的參數一個空值 myReport.SetParameterValue("p" + i.ToString(), ""); } myReport.SetParameterValue("titile", titile); } else { for (int i = 1; i <= 9; i++) { if (i <= cols) //dt1.Columns[i-1].ColumnName myReport.SetParameterValue("p" + i.ToString(), dt1.Columns[i - 1].ColumnName); else //注意,這個不能省,一定要給沒用到的參數一個空值 myReport.SetParameterValue("p" + i.ToString(), ""); } myReport.SetParameterValue("titile", titile); } return myReport; }}
//控制項調用方法 clsDyCrystalReportCore cls = new clsDyCrystalReportCore(); ReportDocument rd = cls.getReportSource(reportname,source); crystalReportViewer1.ReportSource = rd;
以上方法是通過1個dataset.xsd來完成多個報表的列印,
下面是自己通過抽象工廠來做的一個調用多個模板的方法
//直接通過datatable顯示到 crastalReportViewer1中 string sqlStr="SELECT * FROM USERINFO";
DataTable dt = DbHelper.DbHelperSQL.DataQuery(sqlStr).Tables[0];
ReportClass reportClass = ReportFactory.getInstance(reportname);
reportClass.SetDataSource(dt);// 設定資料來源 crystalReportViewer1.ReportSource = reportClass;
using CrystalDecisions.CrystalReports.Engine;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Productsys.Class{ /// <summary> /// 使用原廠模式對報表進行初始化 /// </summary> class ReportFactory { private ReportFactory() {} public static ReportClass getInstance(string reportname) { return (ReportClass)Activator.CreateInstance(Type.GetType(reportname)); } }}
什麼push和pull的分不清,反正就是一個通過xsd一個不通過xsd檔案進行顯示的。。。。。。