zoukankan      html  css  js  c++  java
  • 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文件进行显示的。。。。。。

  • 相关阅读:
    jquery属性
    jquery选择器
    Django的模型
    win7安装RabbitMQ
    阿里云RDS备份的tar格式包恢复到本地自建数据库
    正确使用 Volatile 变量
    深入分析Volatile的实现原理
    volatile和synchronized的区别
    全面理解Java内存模型
    深入理解Feign之源码解析
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/3026894.html
Copyright © 2011-2022 走看看