-
“本地处理模式”是指 ReportViewer 控件在客户端应用程序中处理报表。 所有报表都是使用应用程序提供的数据在本地过程中处理的。
-
远程处理模式指由 SQL Server 2008 或在 Reporting Services 报告服务器以上执行的报表处理。 在远程处理模式下,ReportViewer 控件用作查看器,呈现在 Reporting Services 报表服务器上处理的报表。 从数据检索到报表处理的所有操作都是在报表服务器上处理的。
开发报表功能,开发步骤主要包括:页面添加和配置ReportViewer控件,创建客户端报表定义(.rdlc)文件,配置加载页面的初始化信息。
- 页面添加和配置ReportViewer控件。从工具箱的报表中添加ReportViewer控件,或者直接添加<reWeb:ReportViewer />节点。并设置控件相关属性。
<form id="form1" runat="server">
<div>
<asp:ScriptManager runat="server" ID="scmg"></asp:ScriptManager>
<rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="100%" Height="100%" OnPreRender="ReportViewer1_PreRender"></rsweb:ReportViewer>
</div>
</form>
ReportViewer为Ajax控件,代码中ScripManager是不可少的。OnPreRender事件方法触发PreRender事件,PreRender事件发生在控件加载后和呈现之前,可以用来保存服务器控件的视图状态中的任何更改。
- 创建客户端报表定义文件。在资源管理器中添加新建项-Reporting-报表,生成.rdlc文件。设计报表的样式,并配置页面的参数,数据表、数据源、数据集等相关信息。
配置rdlc文件,主要包括途中标出的部分。参数为需要显示出来的参数(大部分从url的参数传递中获取)。数据集合数据源的配置,采用动态添加的方法(从xml文件中添加),使得数据库与报表不关联。添加方法如下:
1.在资源管理器中右击.rdlc文件,选择打开方式-XML编辑器。
2.在打开的xml文件中,在<tablix></tablix>节点中添加此表的数据集名称,即<DataSetName></DataSetName>
3.在<Report/>节点下定义DataSources和DataSets节点,其中可以定义多个datasource和dataset。
<DataSources>
<DataSource Name="ReportDataSource">
<ConnectionProperties>
<DataProvider>SQL</DataProvider>
<ConnectString />
</ConnectionProperties>
<rd:DataSourceID>742b4967-39c8-4f0b-bd07-6972fc277a1d</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="testTableSet">
<Query>
<DataSourceName>ReportDataSource</DataSourceName>
<CommandText />
</Query>
<Fields>
<Field Name="ID">
<DataField>ID</DataField>
<rd:TypeName>System.Decimal</rd:TypeName>
</Field>
<Field Name="Name">
<DataField>Name</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
<Field Name="VALUE">
<DataField>VALUE</DataField>
<rd:TypeName>System.Decimal</rd:TypeName>
</Field>
<Field Name="PID">
<DataField>PID</DataField>
<rd:TypeName>System.Decimal</rd:TypeName>
</Field>
</Fields>
</DataSet>
</DataSets>
- 配置加载页面的初始化信息。在*.aspx.cs文件的Page_Load()事件方法中设置报表的初始化信息,其中主要包括ReportDataSources,ReportParameters,ReportPath等。
string ReportTitleHeader = "Report Title:";
string ReportTitle = "Report Title";
string SearchConditionHeader = "Search Condition:";
string SC = "Search Condition";
string RP = "";
ReportParameter[] rps;
List<ReportDataSource> lstRDS = new List<ReportDataSource>();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
initPage();
}
}
private void initPage()
{
//获取参数值
ReportTitleHeader = (Request.QueryString["RTH"].Trim().ToString() == "" ? ReportTitleHeader : Request.QueryString["RTH"].Trim().ToString());
ReportTitle = Request.QueryString["RT"].Trim().ToString() == "" ? ReportTitle : Request.QueryString["RT"].Trim().ToString();
SearchConditionHeader = Request.QueryString["SCH"].Trim().ToString() == "" ? SearchConditionHeader : Request.QueryString["SCH"].Trim().ToString();
SC = Request.QueryString["SC"].Trim().ToString() == "" ? SC : Request.QueryString["SC"].Trim().ToString();
RP = Request.QueryString["RP"].Trim().ToString() == "" ? RP : Server.MapPath("~")+@"Content\Report\rdlc\"+ Request.QueryString["RP"].Trim().ToString();
rps=new ReportParameter[]{
new ReportParameter("ReportTitleHeader",ReportTitleHeader),
new ReportParameter("ReportTitle",ReportTitle),
new ReportParameter("SearchConditionHeader",SearchConditionHeader),
new ReportParameter("SC",SC)
};
//获取数据
string sqlstr = string.Format("select * from testTable where PID='{0}' and VALUE>'{1}'", Request.QueryString["ParentID"].Trim().ToString(), Request.QueryString["Value"].Trim().ToString());
DataTable dt = ADO.getTable(sqlstr);
//lstRDS.Add(new ReportDataSource("testTableSet",dt));
//配置报表初始化信息
this.ReportViewer1.LocalReport.DataSources.Clear();
this.ReportViewer1.ProcessingMode = ProcessingMode.Local;
this.ReportViewer1.LocalReport.ReportPath = RP;//设置.rdlc文件路径
this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("testTableSet",dt));//向数据集中添加数据。
this.ReportViewer1.LocalReport.SetParameters(rps);//设置参数值
this.ReportViewer1.LocalReport.Refresh();//刷新呈现
}
protected void ReportViewer1_PreRender(object sender, EventArgs e)
{
foreach (RenderingExtension item in ReportViewer1.LocalReport.ListRenderingExtensions())
{
if (item.Name=="PDF")
{
FieldInfo fieldInfo = item.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic);
fieldInfo.SetValue(item, false);
}
}
}