/// <summary>
/// 获得报表参数信息
/// </summary>
private ParameterFields GetParameterFields()
{
ParameterFields fields = new ParameterFields();
//单位、部门、人员、日期范围参数
fields.Add(this.CreateParameterField("liushuihao", bllorder.GetMaxId()));
string orve_year = bllChangeSeason.GetYear();
string orve_season = bllChangeSeason.GetSeason();
string jijie = orve_year + orve_season + "教材征订录入";
fields.Add(this.CreateParameterField("jijie", jijie));
//返回
return fields;
}
/// <summary>
/// 建立参数字段
/// </summary>
/// <param name="FieldName">字段名</param>
/// <param name="FieldValue">字段值</param>
/// <returns>参数字段</returns>
private ParameterField CreateParameterField(string FieldName, object FieldValue)
{
ParameterField field = new ParameterField();
ParameterDiscreteValue pvalue = new ParameterDiscreteValue();
pvalue.Value = FieldValue;
field.ParameterFieldName = FieldName;
field.CurrentValues.Add(pvalue);
//返回参数字段
return field;
}
//绑定时写
this.CrystalReportViewer1.ParameterFieldInfo = this.GetParameterFields(); //参数信息
一、离散值。
在水晶报表的设计中,在有些情况下会遇到从界面向水晶报表传值的情况,也会有在格式化显示的情况下使用离散值。首先先看一下如何使用离散值。
1、创建离散值
在【参数字段管理器】中选择【参数字段】,并右击【新建】。这时会出现创建参数字段对话框。在默认情况下是选中【离散值】的。填写上名称(即参数名称,中英文都可),提示文本(根据实际情况进行填写,在没有必要的情况下可以不填写),选择好值类型。点击【确定】即可。这样在【参数字段】下就出现了我们创建的参数(假设我们创建的名称为:姓名)。我们将“姓名”拖到水晶报表界面上,形式为“?姓名”。
2、向离散值进行传值
传值需要代码进行控制,核心代码如下:
//包含报表中每个参数字段的ParameterField对象。这里可以理解为得到界面上所有的参数字段。注意:在一个报表中,只需声明一次。
ParameterFields paramFields = new ParameterFields();
//获取和设置参数字段的选项和值。这里可以理解为创建实例。
ParameterField paramFieldTCDDID = new ParameterField();
//获取和设置离散值参数
ParameterDiscreteValue discreteValp = new ParameterDiscreteValue();
//设置离散值参数名:姓名
paramFieldTCDDID.ParameterFieldName = "姓名";
//赋值
discreteValp.Value = Value;
//添加值到离散值参数中
paramFieldTCDDID.CurrentValues.Add(discreteValp);
//将这个"实例"放回“集合”中。
paramFields.Add(paramFieldTCDDID);
//将“集合”返回到报表查看器。
crystalReportViewer1.ParameterFieldInfo = paramFields;
这样一个给离散值参数赋值的过程就做完了。
二、当水晶报表中有多个表作为数据源时,如何一次性赋值。
我们都知道,当水晶报表的数据源只有一个数据源时是很好解决赋值问题的,但是当水晶报表的数据源是多个表的时候我们要怎么做呢?
我们都知道水晶报表的数据源类型为DataSet(DataTable)。那么我们可以根据这一特性进行操作。PUSH模式下,在创建的数据集文件中建立多个DataTable,对应水晶报表中要显示的多个表。这样一来,数据集文件和水晶报表的对应就做好了。比如说水晶报表上要显示三个表的内容,那么在数据集文件中就建立三个DataTable。接下来在代码中进行赋值控制。这时,我们返回的就不是Datatable了而是DataSet。我们是知道的,DataSet是DataTable的集合,那么我们将存储过程中返回的每一个表(即我们用到的那三个表)封装到DataSet中。需要注意的是Fill()中的表名需要和数据集文件中的表的名称相一致。这样,给水晶报表多个表显示数据传递数据源就完成了。
代码:
public static DataSet Rtp_TC_Select_Product(string value)
{
SqlConnection conn = DBConnect.GetConnection();
DataSet ds = new DataSet();
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("TC_Rpt_Select_Product", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@value", SqlDbType.VarChar, 200).Value = value;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds, "Product");
//
SqlCommand cmd1 = new SqlCommand("TC_Rpt_Select_TiaoKuan", conn);
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.Add("@value", SqlDbType.VarChar, 200).Value = value;
//SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd1;
da.Fill(ds, "TiaoKuan");
//
SqlCommand cmd2 = new SqlCommand("TC_Rpt_Select_ZhuangYunQiXian", conn);
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.Parameters.Add("@value", SqlDbType.VarChar, 200).Value = value;
//SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd2;
da.Fill(ds, "zyqx");
}
catch
{
}
finally
{
conn.Close();
}
return ds;
}
我们将返回的ds赋值给水晶报表就搞定了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xm18love/archive/2010/01/11/5175558.aspx