zoukankan      html  css  js  c++  java
  • 选择字段,创建用户自定义的水晶报表

     在实际应用中,统计人员有根据要求制作特定统计报表的需要。本文参考了网上文章《在水晶报表中实现任意选择指定字段显示(阿泰)》,并在vs2008、sql2005环境下使用C#开发测试。测试运行界面如下图所示:

     

    选择字段,创建用户自定义的水晶报表

     

        1、创建报表所用的数据集文件

        创建windows窗体应用程序CustomerReport。为了使用XSD数据集配置文件创建报表格式定义所用的数据集,在方案中新建一个名为“用于生成数据集的项目”的窗体应用项目。右键点击“用于生成数据集的项目”项目名,选择添加-->新建项。如下图所示,在弹出界面中选择创建数据集:

     

    选择字段,创建用户自定义的水晶报表

     

        在打开的DataSet1.xsd界面中,右键点击添加数据表,或直接从工具箱的数据集控件中拖放一个DataTable控件。如下图所示,右键点击DataTable控件,为其添加自定义列。这里定义了六个字段,字段(列)名称可以随意。

        这里选择以Northwind数据库的Employees表为模板,自定义的六个字段分别对应表EmployeeID、LastName、FirstName、Title、BirthDate、Address等六个字段,所以要注意自定义字段的数据类型必须与它们一一对应。其中EmployeeID可以选择INT32类型,BirthDate为System.DateTime类型。

    选择字段,创建用户自定义的水晶报表

         如下图所示,编辑DataSet1.xsd的属性,在数据集项目中选择CustomerReport项目,作为数据集类文件的输出项目。修改数据集类文件名为DataSet1.cs:

    选择字段,创建用户自定义的水晶报表

        把文件保存一下,系统会自动在CustomerReport项目中创建DataSet1.cs数据集类文件。

        2、创建和设置报表文件

        右键点击项目名称CustomerReport,选择添加新建项,添加Crystal空白报表。如下图所示:

    选择字段,创建用户自定义的水晶报表


     

        如下图所示,在字段资源管理器中右键点击“数据库字段-->数据库专家”,添加定义报表所用的数据表:

     

    选择字段,创建用户自定义的水晶报表
    选择字段,创建用户自定义的水晶报表
    选择字段,创建用户自定义的水晶报表
    选择字段,创建用户自定义的水晶报表

        通过定义,确定了报表可以接受的数据表DataTable及其字段(列)的数据类型。对于一般报表,只要把刚才添加的字段拖放到报表格式的“详细资料”栏内就可以了,但这里要定义的是动态报表,需要使用公式字段作为报表列。

        在字段资源管理器中右键点击公式字段-->新建,创建六个公式字段。如下图所示:

    选择字段,创建用户自定义的水晶报表
        输入公式字段名后回车,不作详细设置,只要一个字段名就可。

        除了详细资料(列)所用的公式字段,报表的页眉(列名称)需要用到参数字段。如下图所示,再定义六个参数字段,字段类型都选择字串类型:

    选择字段,创建用户自定义的水晶报表

        将六个公式字段依次拖到报表格式的详细资料栏:

    选择字段,创建用户自定义的水晶报表

        如图所示,可以选中页眉和详细资料调整其位置和宽度,当然也可以把一行的各字段都选上,右键设置对齐方式等。

        把页眉中系统默认添加的字段名都删除掉,把刚才新建的六个参数字段依次拖放到页眉中,并设置格式(还可以把页眉设置为黑体)。如下图所示:

    选择字段,创建用户自定义的水晶报表

        使用报表工具Box Object和Line Object为报表添加表格框和表格线。如下图所示:

    选择字段,创建用户自定义的水晶报表

        3、如下图所示,为Form1表单添加字段选择控件。注意控件的Text属性要与数据库表的字段名相同:

    选择字段,创建用户自定义的水晶报表
        4、为按钮添加点击事件处理方法,代码如下:

            private void button1_Click(object sender, EventArgs e)
            {

                String fieldString = "";

                if(checkBox1.Checked)
                    fieldString = checkBox1.Text;
                if(checkBox2.Checked)
                    fieldString = fieldString + "," +checkBox2.Text;
                if(checkBox3.Checked)
                    fieldString = fieldString + "," +checkBox3.Text;
                if(checkBox4.Checked)
                    fieldString = fieldString + "," +checkBox4.Text;

                if(checkBox5.Checked)
                    fieldString = fieldString + "," +checkBox5.Text;
                if(checkBox6.Checked)
                    fieldString = fieldString + "," +checkBox6.Text;
                if (fieldString == "")
                {
                    MessageBox.Show("请选择要显示的字段");
                    return;
                }
                //删除第一个逗号,使字串最终显示为 "字段1,字段2,字段3"
                if (fieldString.Substring(0, 1) == ",")
                    fieldString = fieldString.Substring(1, fieldString.Length - 1);

                Form2 form = new Form2(fieldString);
                form.Show();

            }

        以上代码主要是获取查询字段。

        5、创建显示报表的窗体Form2

        添加窗体Form,从报表工具中选择CrystalReportViewer拖放到窗体中:   选择字段,创建用户自定义的水晶报表

        6、编辑Form2代码如下:

        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;
        using CrystalDecisions.Shared;
        using System.Data.SqlClient;
        using CrystalDecisions.CrystalReports.Engine;

        namespace CustomerReport
        {
            public partial class Form2 : Form
            {
                private String fieldString;
                private String[] fieldArray;
                public Form2(String fieldString)
                {
                    InitializeComponent();
                    this.fieldString = fieldString;
                }

                private void Form2_Load(object sender, EventArgs e)
                {
                    int i, j;
                    ParameterFields paramFields = new ParameterFields();
                    ParameterField paramField;
                    //参数离散值定义
                    ParameterDiscreteValue discreteVal;

                    fieldArray = fieldString.Split(',');
                    //MessageBox.Show(fieldArray[2]);

                    SqlConnection conn = new SqlConnection("server=GTJ-KQS75Q8RX6P\MYSQLDB;

                            database=Northwind;user id=sa;password=sa");
                    String sqlstr = "select " + fieldString + " from Employees";
                    SqlDataAdapter ada = new SqlDataAdapter(sqlstr, conn);

                    DataSet ds = new DataSet();
                    //表名称要与报表定义引入的数据表名一致
                    ada.Fill(ds, "DataTable1");

                    //定义报表对象
                    ReportDocument myReport = new CrystalReport1();

                    //参数设置部分.设置第一个离散值并将其传递给该参数(传递参数做为表头)
                    for (i = 0; i < fieldArray.Length; i++)
                    {
                        paramField = new ParameterField();
                        paramField.ParameterFieldName = "myParaField" + (i + 1).ToString();
                        discreteVal = new ParameterDiscreteValue();
                        discreteVal.Value = fieldArray[i];
                        paramField.CurrentValues.Add(discreteVal);
                        paramFields.Add(paramField);
                        paramField.AllowCustomValues = false;

                        //公式字段设置。
                        //如果字段类型为整数,报表显示默认可能显示小数,需要使用totext函数转换一下。
                        if (fieldArray[i] == "EmployeeID")
                           myReport.DataDefinition.FormulaFields["myField" + (i + 1).ToString()].Text

                               = "totext(tonumber({DataTable1." + fieldArray[i] + "}),0)";
                        else
                           myReport.DataDefinition.FormulaFields["myField" + (i + 1).ToString()]

                               .Text = "{DataTable1." + fieldArray[i] + "}";
                    }

                    //设置未选择的列标题为空

                    for (j = i + 1; j <= 6; j++)
                    {
                        paramField = new ParameterField();
                        paramField.ParameterFieldName = "myParaField" + j.ToString();
                        discreteVal = new ParameterDiscreteValue();
                        discreteVal.Value = "";
                        paramField.CurrentValues.Add(discreteVal);
                        paramFields.Add(paramField);
                        paramField.AllowCustomValues = false;
                    }

                    //报表参数绑定

                    crystalReportViewer1.ParameterFieldInfo = paramFields;

                    //报表数据源绑定
                    myReport.SetDataSource(ds);
                    crystalReportViewer1.ReportSource = myReport;
                    //MessageBox.Show(ds.Tables[0].Rows[1][1].ToString());
                }
            }
        }

        参考文章

        在水晶报表中实现任意选择指定字段显示 (阿泰)

  • 相关阅读:
    vue3.0提前了解系列一 通过cli快速搭建一个3.0项目
    vscode卡的飞起解决办法-其中之一
    常用正则表达式整理
    jq-outerhtml不能执行新元素内部的js解决方案
    前端面试题(亲身面试经验)
    MAC上Cisco AnyConnect删除不干净,造成无法重新安装的解决办法
    vue需要知道哪些才能算作入门以及熟练
    jquery版本轮播图(es5版本,兼容高)
    webpack4常用片段
    前端速度优化
  • 原文地址:https://www.cnblogs.com/yanergui/p/5624763.html
Copyright © 2011-2022 走看看