本人在前段时间研究了一下关于水晶报表生成的问题,因为没有碰过水晶报表,所以搜了很多内容,经过整合做出一个比较简单的水晶报表。(我是用VS2008做的)
首先应按“推模式”创建报表
1、设计DataSet
1)新建DataSet
2)连接数据库、并把所需字段或表放入DataSet如图:
2、创建报表文件
1)新建报表文件
并按完成(除非有其他设置)
按完成后的报表样式
2)新建公式字段(这个是动态生成列的关键)
创建空白的公式字段并保存
请根据你想动态生成字段的最大值来创建公式字段,如:我要在7个列中动态显示,即最大值为7,创建7个公式字段(切记,公式字段为空白。使用专家、编辑器,都可以,只要是空白的就行了)
把上表(报表)的内容删去,改为放入你自己刚才创建的公式字段(表头的名字我改成Text,方便区分)
对各列抑制显示,选择设置对象格式
选择最右端的 ("X-2")
输入如下代码(x代表1、2.... ,这个与自己起的名字有关)
if NextIsNull ({@FormulaFieldx})then
true
else
false
其他的如此类推
控制代码:
private void BindReport(string[] fldArr) //fldArr为显示列的名称数组
{
DataSet ds = new DataSet();
string conn = "DSN=xxxx;uid=xxxx;pwd=123456";
CrystalReport cr = new CrystalReport();
string sql = "select " + str + " from table";
ReportsService.ReportsService.FillDataSet(ds, "table", sql, conn);
string[] fldArr = new string[length];
for (int i = 0; i < fldArr.Length; i++)
{
// 将公式绑定到具体字段
cr.DataDefinition.FormulaFields["FormulaField" + (i + 1).ToString()].Text = "{studentinfo." + fldArr[i] + "}";
TextObject gettext = cr.ReportDefinition.ReportObjects["Text" + (i + 1).ToString()] as TextObject;
gettext.Text = fldArr[i];
}
cr.SetDataSource(ds);
CrystalReportViewer.ReportSource = cr;
}