您的位置:首页 > 其它

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

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

}

}

}

参考文章

在水晶报表中实现任意选择指定字段显示 (阿泰)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: