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

 在实际应用中,统计人员有根据要求制作特定统计报表的需要。本文参考了网上文章《在水晶报表中实现任意选择指定字段显示(阿泰)》,并在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());
            }
        }
    }

    参考文章

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

posted @ 2016-04-08 14:52  燕儿归  阅读(3108)  评论(0编辑  收藏  举报