• 水晶报表之动态列简化版实现


    水晶报表之动态列--简化版实现 

    第一步:新建一个vs2008的水晶报表的空白项目。在弹出报表数据源选择框的时候,不要选择任何任何数据源,直接点确定,创建一个空白报表。

    第二步:项目中添加一个Dataset1.xsd,手工建立一个DataTable,命名为BigTable。建立6个字段,全部为String型。
    为什么用6个呢?这个数字6的确立,是根据你的实际需要,这个表的列的数目,需要大于等于你所需要操作的事实表的最大列数。
    用为什么用String型呢?我们知道基本上所有的基础数据类型都可以转换为String,这样我们的这个表基本上可以容纳所有的数据类型。

    好了,在报表中添加这个Bigtable.

     

    6个字段拖到详细资料节。对齐。()


    注意!不要使用框和线来画格子,这里用的是字段边框,初次操作可以暂时不用,我后面会专门讲一下这个格线的处理。

    好了,这样我们的万能模板就做成了。很简单,是吗?呵呵。

     

    这样界面也完成了。

    第四步:实现原理

    上面的几步下来,有经验的朋友基本上看出来我们是要用PUSH模式来实现了。
    既然我们已经在报表里用到了BigTable,那么我们要传递给报表的数据,也就要整形成BigTable的样子。
    也就是说,只要能把来源数据表的数据,整形成BigTable的样子,就能用这一个模板显示出来。
    而不用管来源表从哪里来,表名是什么,有几个字段(但是字段数目需要小于等于6),字段名是什么,有多少数据。
    从而达到万能的目的。

    我把这个工作简单封装了一下,做了个小方法。

     

    class clsDyCrystalReportCore
        {
            /// <summary>
            /// 将传入的datatable转换成报表模板所需要的datatable
            /// 数据全部转换为string
            /// </summary>
            /// <param name="dt">来源表</param>
            /// <returns>报表模板所需要的datatable</returns>

            public DataTable dtx(DataTable dt)
            {
                DataSet1.BigTatableDataTable dtx1 = new DataSet1.BigTatableDataTable(); 

    //DataSet中建立了BigTatable之后, DataSet1自动就有了这个表的属性       
                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;
            }
        }

     

    就是来源表按照BigTable的结构写到BigTable里面去。很简单的代码,但也是这个方案的核心。

    第五步:功能实现。

     

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Text;
     6 using System.Windows.Forms;
     7 using CrystalDecisions.Shared;
     8 using CrystalDecisions.CrystalReports.Engine;
     9 using CrystalDecisions.Windows.Forms;
    10 using System.Data.OleDb;
    11 namespace DyCrystalReportDemo
    12 {
    13     public partial class Form1 : Form
    14     {
    15         public Form1()
    16         {
    17             InitializeComponent();
    18         }
    19 
    20         private void button1_Click(object sender, EventArgs e)
    21         {
    22             String tblName = comboBox1.Text ;
    23              String connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Threading.Thread.GetDomain().BaseDirectory+ "bbtcrall.mdb" + ";";
    24             
    25             if (tblName == "")
    26             {
    27                 MessageBox.Show("请选择表名");
    28                 comboBox1.Focus();
    29                 return;
    30             }
    31 
    32             //打开数据库连接
    33             
    34             DataTable dt1 = new DataTable();
    35             DataTable dtx = new DataTable();
    36             OleDbDataAdapter da = new OleDbDataAdapter();
    37             OleDbConnection cn = new OleDbConnection(connstr);
    38             
    39             //打开选择的表(注意进行错误保护)
    40 
    41             //如果要实现任意列,只需将要显示的列通过参数传过来,然后用循环加到sql语句中即可
    42             da = new OleDbDataAdapter("SELECT * From " + tblName, cn);
    43             da.Fill(dt1);//调用上面定义的方法对datatable数据集化
    44 
    45             //处理ds1
    46             clsDyCrystalReportCore xCore = new clsDyCrystalReportCore();
    47             dtx = xCore.dtx(dt1);
    48             
    49             ReportDocument myReport = new ReportDocument();
    50             string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "crystalreport1.rpt";
    51             myReport.Load(reportPath);
    52 
    53             //绑定数据集,注意,一个报表用一个数据集。
    54 
    55             myReport.SetDataSource(dtx);
    56            
    57             crystalReportViewer1.ReportSource = myReport;
    58             crystalReportViewer1.RefreshReport();
    59         }
    60 
    61         private void Form1_Load(object sender, EventArgs e)
    62         {          
    63             comboBox1.Items.Add ("Test1_1");
    64             comboBox1.Items.Add ("Test1_2");        
    65         }
    66     }
    67 }

    后话:对于边框的处理,可以用框对象和线条对象,通过代码调控线的长度,位置和是否抑制显示即可完成

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    每日leetcode-数组-506. 相对名次
    每日leetcode-数组-412. Fizz Buzz
    每日leetcode-数组-299. 猜数字游戏
    正则表达式
    Linux三剑客之grep
    Google 74版本上传附件没有“选择文件”按钮
    Google卸载后再次安装提示安装失败
    linux下,数据泵导dmp文件
    Oracle数据库创建表空间
    Lr controller运行时,报错missing newline in C:userAdministratorDesktopjiekouusername.dat
  • 原文地址:https://www.cnblogs.com/tiandi/p/1980412.html
Copyright © 2020-2023  润新知