为了大家理解,我先简要说一下我们这个表格的设计,以下是这个表格做成后的一个图:
相信大家做社保、人力资源等mis系统的时候经常用到这种类型的表格。现在有了vs里的rdlc大家再也不用去花银子买那些昂贵的报表软件了。
现在就说一下设计步骤
1. 新建一个报表,默认名为“Report1.rdlc”
2. 添加一个“列表”,这是最关键的,因为这个报表是打印多条记录(Row),所以必须用这个“列表”作为一个容器,否则以后显示出来的数据就只有一条,在Toolbar上只会看见(1/1页),就因为这个问题偶整了两天。
3. 加入“表”,把“表”拖进“列表”里,这样“表”里的所有字段才能动态显示如“=First(Fields!Student_Address.Value)”,顺便提一下,应该把所有显示的东西全部放到“列表”里。
4. 要想设计成为上图那种表格,需要把“表详细信息”去掉,只留“表格表头”和“表格表尾”,因为在表头和表尾的区域才能嵌入另一个“表”,
5. 设计整理好表格框架,这部份主要是调整表格结构,象上图那些“姓名、性别”这种是用手工敲上去的,“李小华、男”这种是拖放的数据库字段,当然字段是从数据集里拖进来还是数据库里施,这完全取决于你的程序设计,偶这里是从数据集里拖进来的
6.在“列表”的属性里(点列表空白处右键),设置一个分组并设置在结尾处分页,即然是分组那肯定是唯一值,看下图,我选用的是数据库里的自增ID作为分组依据。要不然以后有相同值的时候页数就会错误
7. 图像那里有个问题,“表”不支持上下行的合并,这怎么办呢?我只有手动调整图像的位置(用键盘上的上下左右键去移动,配合一下在图像属性里调整Size值),但是在记住,这图像必须是被“列表”包含的,也就是说先把图像托到“例表”内,否则图像不会读取数据,我这里的图像是取的外部URL图像地址。
8. 最后一步就是在winform里加入reprotviewer控件使其绑定到这张报表上。后面的编程就不多说了。
用objectdatasource来传参数的
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = Server.MapPath("Reports/ContractQuery.rdlc");
ObjectDataSource ods = new ObjectDataSource("MDCLib", "QueryContract");
QueryStringParameter para = new QueryStringParameter("QueType", TypeCode.String,"reportid");
para.DefaultValue = "0";
ods.SelectParameters.Add(para);
ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("mdc_ExpireContract_MDC_ExpireContract", ods));
用reportview显示RDLC文件
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using Microsoft.Reporting.WebForms;
public partial class DrillThroughReport_Parent : System.Web.UI.Page
{
public SqlParameter[] Level1SearchValue = new SqlParameter[1];
public SqlParameter[] Level2SearchValue = new SqlParameter[1];
public string thisConnectionString =
ConfigurationManager.ConnectionStrings
["NorthwindConnectionString"].ConnectionString;
DrillThroughDataSet ds = new DrillThroughDataSet();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void ReportViewer1_Drillthrough1(object sender, DrillthroughEventArgs e)
{
//Get OrderID that was clicked by
//user via e.Report.GetParameters()
ReportParameterInfoCollection DrillThroughValues =
e.Report.GetParameters();
//This is just to show you how to iterate
//through the collection if you have
//multiple parameters values instead of a single parameter value.
//To process multiple parameters values,
//concatenate d.Values[0] into a string with a delimiter.
//Use the Split() method to separate values
//into an array. Assign indivdual array element to
//corresponding parameter array element.
foreach (ReportParameterInfo d in DrillThroughValues)
{
lblParameter.Text = d.Values[0].ToString().Trim();
}
LocalReport localreport = (LocalReport)e.Report;
//Fill dataset for Level1.rdlc
SqlConnection thisConnection = new SqlConnection(thisConnectionString);
System.Data.DataSet Level1DataSet = new System.Data.DataSet();
Level1SearchValue[0] = new SqlParameter("@OrderID",
lblParameter.Text.Trim());
Level1DataSet = SqlHelper.ExecuteDataset(thisConnection,
"Show_OrderDetails", Level1SearchValue);
ReportDataSource level1datasource = new
ReportDataSource("DrillThroughDataSet_Show_OrderDetails",
Level1DataSet.Tables[0]);
localreport.DataSources.Clear();
localreport.DataSources.Add(level1datasource);
localreport.Refresh();
}
protected void Button1_Click(object sender, EventArgs e)
{
ReportViewer1.Visible = true;
SqlConnection thisConnection = new SqlConnection(thisConnectionString);
System.Data.DataSet thisDataSet = new System.Data.DataSet();
//Run the stored procedure to fill dataset for Parent.rdlc
thisDataSet = SqlHelper.ExecuteDataset(thisConnection,
"List_Customers_OrderTotal");
//和设计时表名一致
//Assign dataset to report datasource
//datasource的名称即DrillThroughDataSet_List_Customers_OrderTotal要和设计报表时的数据源名称一致
ReportDataSource datasource =
new ReportDataSource("DrillThroughDataSet_List_Customers_OrderTotal",
thisDataSet.Tables[0]);
//Assign datasource to reportviewer control
ReportViewer1.LocalReport.ReportPath = "parent.rdlc";
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(datasource);
ReportViewer1.LocalReport.Refresh();
}
}
|