c#水晶报表总结

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文件进行显示的。。。。。。

原文地址:https://www.cnblogs.com/anbylau2130/p/3026894.html