在实际应用中,统计人员有根据要求制作特定统计报表的需要。本文参考了网上文章《在水晶报表中实现任意选择指定字段显示(阿泰)》,并在vs2008、sql2005环境下使用C#开发测试。测试运行界面如下图所示:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s15.sinaimg.cn/middle/5f30147ah9ef93159900e&690)
1、创建报表所用的数据集文件
创建windows窗体应用程序CustomerReport。为了使用XSD数据集配置文件创建报表格式定义所用的数据集,在方案中新建一个名为“用于生成数据集的项目”的窗体应用项目。右键点击“用于生成数据集的项目”项目名,选择添加-->新建项。如下图所示,在弹出界面中选择创建数据集:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s8.sinaimg.cn/middle/5f30147ah9ef4d818fbd7&690)
在打开的DataSet1.xsd界面中,右键点击添加数据表,或直接从工具箱的数据集控件中拖放一个DataTable控件。如下图所示,右键点击DataTable控件,为其添加自定义列。这里定义了六个字段,字段(列)名称可以随意。
这里选择以Northwind数据库的Employees表为模板,自定义的六个字段分别对应表EmployeeID、LastName、FirstName、Title、BirthDate、Address等六个字段,所以要注意自定义字段的数据类型必须与它们一一对应。其中EmployeeID可以选择INT32类型,BirthDate为System.DateTime类型。
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s8.sinaimg.cn/middle/5f30147ah9ef525202f57&690)
如下图所示,编辑DataSet1.xsd的属性,在数据集项目中选择CustomerReport项目,作为数据集类文件的输出项目。修改数据集类文件名为DataSet1.cs:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s1.sinaimg.cn/middle/5f30147ah9ef6110bb910&690)
把文件保存一下,系统会自动在CustomerReport项目中创建DataSet1.cs数据集类文件。
2、创建和设置报表文件
右键点击项目名称CustomerReport,选择添加新建项,添加Crystal空白报表。如下图所示:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s5.sinaimg.cn/middle/5f30147ah9ef6398a3174&690)
如下图所示,在字段资源管理器中右键点击“数据库字段-->数据库专家”,添加定义报表所用的数据表:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s4.sinaimg.cn/middle/5f30147ah9ef69414d173&690)
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s12.sinaimg.cn/middle/5f30147ahe35a1f2f792b&690)
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s3.sinaimg.cn/middle/5f30147ahe35a223d7af2&690)
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s4.sinaimg.cn/middle/5f30147ah9ef6a19a1263&690)
通过定义,确定了报表可以接受的数据表DataTable及其字段(列)的数据类型。对于一般报表,只要把刚才添加的字段拖放到报表格式的“详细资料”栏内就可以了,但这里要定义的是动态报表,需要使用公式字段作为报表列。
在字段资源管理器中右键点击公式字段-->新建,创建六个公式字段。如下图所示:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s10.sinaimg.cn/middle/5f30147ah9ef7a6bcdc09&690)
输入公式字段名后回车,不作详细设置,只要一个字段名就可。
除了详细资料(列)所用的公式字段,报表的页眉(列名称)需要用到参数字段。如下图所示,再定义六个参数字段,字段类型都选择字串类型:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s14.sinaimg.cn/middle/5f30147ah9ef7c455e24d&690)
将六个公式字段依次拖到报表格式的详细资料栏:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s8.sinaimg.cn/middle/5f30147ah9ef7d9009a47&690)
如图所示,可以选中页眉和详细资料调整其位置和宽度,当然也可以把一行的各字段都选上,右键设置对齐方式等。
把页眉中系统默认添加的字段名都删除掉,把刚才新建的六个参数字段依次拖放到页眉中,并设置格式(还可以把页眉设置为黑体)。如下图所示:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s15.sinaimg.cn/middle/5f30147ah9ef807d6935e&690)
使用报表工具Box Object和Line Object为报表添加表格框和表格线。如下图所示:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s13.sinaimg.cn/middle/5f30147ah9ef94baaa28c&690)
3、如下图所示,为Form1表单添加字段选择控件。注意控件的Text属性要与数据库表的字段名相同:
![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s13.sinaimg.cn/middle/5f30147ah9ef8579490cc&690)
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拖放到窗体中: ![选择字段,创建用户自定义的水晶报表 选择字段,创建用户自定义的水晶报表](http://s8.sinaimg.cn/middle/5f30147ah9ef87bebb987&690)
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());
}
}
}
参考文章:
在水晶报表中实现任意选择指定字段显示 (阿泰)