.net 流氓
天下无难事,有志者成之;天下无易事,有恒者得之。

昨天写了用C#做最基本的报表,并手动配置数据源,这篇主要讲报表参数设置和建立子表,分组。

一 建立报表参数    

    打开昨天的项目,在Report文件夹中新建报表rptStudent .rdlc,拖入一张表,点击报表-报表参数--参数--添加,参数名称Cno,确定

二 为子报表添加数据集

    依然是报表--数据源--把RptDataSet_Student添加到报表,确定.

三 设计子报表

    添加分组,如图1

图1
分组依据为ClassID,包括组头和组尾。如图2
图2
作如下设置
其中的=Count(Fields!Sno.Value) 可以右击单元格,表达式--常见函数--聚合,选择Count(),再在Count()的括号中选择字段,双击Sno。
这里顺便讲一下分组,其实分组就像SQL里面的聚合函数,通过一定的分组依据,把数据划分成相同性质的若干小组,就像这里用班号,把学生数据划分为若干个班级。
然后选择中表格,右键,选择属性的筛选器,设置(=Fields!ClassID.Value)=(=Parameters!.Cid.value)
四 在主报表中的设置.
   打开主报表rptClass,从工具箱里面拖一张子表放入组尾(最好把尾组的一行单元格合并),重命名为subRptStudent
  设置子报表subRptStudent控件的ReportName为rptStudent,右键--属性--参数--Cid值为=Fields!SystemKey.Value,如图
 
五编写Student的数据访问类
    首先,在DataSource文件中添加Studnet的数据处理类StudentDataSource.类的内容如下,它为报表提供数据源实例。
public class StudentDataSource
{
public DataTable GetStudentData()
{
DataTable dt
= new DataTable();
SqlConnection conn
= new SqlConnection(ConfigurationManager.ConnectionStrings["ReportingAPP.Properties.Settings.RptDBConnectionString"].ToString());
StringBuilder cmdText
= new StringBuilder();
cmdText.Append(
"SELECT [SystemKey] ,[Sno],[Sname],[ClassID] FROM [Student]");
try
{
conn.Open();
SqlCommand cmd
= new SqlCommand(cmdText.ToString(), conn);
dt.Load(cmd.ExecuteReader());
}
catch (Exception ex)
{
}
finally
{
conn.Close();
}
return dt;
}
}

然后在主窗体中添加
六  为子报表添加子报表的本地处理事件的委托方法。
在主窗体中添加如下方法
        private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
e.DataSources .Add (
new ReportDataSource("RptDataSet_Student", studentDataSource.GetStudentData())
);
}

七 为主报表添加添加子报表的本地处理事件
    在主窗体的Load事件中,添加如下语句
 private void FrmRptMain_Load(object sender, EventArgs e)
{
this.rptViewMain.LocalReport.SubreportProcessing +=
new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);//如果没有这个会报子报表无法显示的错误
this.rptViewMain.LocalReport.ReportEmbeddedResource = "ReportingAPP.Report.rptClass.rdlc";
this.rptViewMain.LocalReport.DataSources.Add(
new ReportDataSource("RptDataSet_Class",dataSource.GetClassData ())
);
this.rptViewMain.RefreshReport();
}

好吧,现在我是迫不及待的按F5了。。。。。。并没有显示学生名字。。。rptStudent中的表要把设置DataSetName为RptDataSet_Student,输出数据选择为是。
现在可以了。运行结果如下
现在来简单的总结一下子报表的处理
1)报立子报表的RDLC文件,建立参数,选择数据集,写好筛选器的条件,为报表里的表选择好DataSetName,输出数据设置为是,并按所需设置子报表格式和内容
2)在主报表中添加子报表控件,选择子报表控件的ReportName为刚建立好的RDLC子报表,设置参数。
3)为子报表写数据源提供数据实例(编写相关的DataSource类)
4)编写本地报表的委托处理方法
  private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
e.DataSources .Add (
new ReportDataSource("RptDataSet_Student", studentDataSource.GetStudentData())
);
}

5)添加子报表的本地处理事件 this.rptViewMain.LocalReport.SubreportProcessing +=
                 new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
好像有点累,今天就到这里吧,明天写钻取报表。
posted on 2011-08-09 10:35  .net 流氓  阅读(894)  评论(0编辑  收藏  举报