三、观察报表运行效果
至此,我们已经完成报表的创建。下面,我们将构建一个普通Web页面来显示此报表。为此,我将创建一个简单的页面,它能够让用户选择客户,然后能够预览相应于选定客户的任何发票信息。在本文示例中,我们直接使用示例网站AdventureWorksReports生成的默认页面Default.aspx。
请按照如下步骤进行操作:
(1)打开页面Default.aspx,从工具栏中展开“报表”选项卡,然后把其中的CrystalReportViewer控件拖动到页面中。
此后,系统会自动添加如下内容:
紧跟着Page指令后面添加如下的Register指令。
源码清单2
<%@ Register assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral,
PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>
PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>
这段代码可以允许你使用VS2008内置的Crystal Reports Viewer控件。
(2)在默认的DIV标记间加入如下代码:
源码清单3
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="5" DynamicLayout="true" AssociatedUpdatePanelID="UpdatePanel1">
<ProgressTemplate >
<div style="position: absolute; top: 2px; right: 0; width: 100%; text-align: right;">
<img alt="loading" src='<%=Page.ResolveUrl("~/progress.gif") %>'/>
<span style="background-color: rgb(204, 68, 68);"> <span style="color: #ff0066"><span
style="background-color: #999999"><span style="font-size: 14pt"><strong>正在加载数据,请稍候...</strong>...</span></span></span>
</span>
</div>
</ProgressTemplate>
</asp:UpdateProgress>
<div>
请选择客户:<asp:DropDownList ID="ddlCustomer" runat="server">
</asp:DropDownList>
<asp:Button ID="btnPreview" runat="server" onclick="btnPreview_Click"
Text="预览" />
<br />
<br />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnPreview" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
</asp:ScriptManager>
<asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="5" DynamicLayout="true" AssociatedUpdatePanelID="UpdatePanel1">
<ProgressTemplate >
<div style="position: absolute; top: 2px; right: 0; width: 100%; text-align: right;">
<img alt="loading" src='<%=Page.ResolveUrl("~/progress.gif") %>'/>
<span style="background-color: rgb(204, 68, 68);"> <span style="color: #ff0066"><span
style="background-color: #999999"><span style="font-size: 14pt"><strong>正在加载数据,请稍候...</strong>...</span></span></span>
</span>
</div>
</ProgressTemplate>
</asp:UpdateProgress>
<div>
请选择客户:<asp:DropDownList ID="ddlCustomer" runat="server">
</asp:DropDownList>
<asp:Button ID="btnPreview" runat="server" onclick="btnPreview_Click"
Text="预览" />
<br />
<br />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnPreview" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
上面的代码将在事件触发后在页面中添加一个填充有客户列表的下拉列表框。其中,“预览”按钮将负责取得所有对应于选定客户的数据并绑定到报表中。其中涉及到其中的AJAX编程,因为这不是本示例的重点,故不再赘述。
(3)在后台代码文件中加入如下using指令:
源码清单4
using System.Data.SqlClient;
using System.Configuration;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Configuration;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
(4)在Page_Load事件函数中加入如下代码:
源码清单5
if (!IsPostBack)
{
//使用数据填充下拉列表框
SqlConnection cn = new SqlConnection(
ConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"].ConnectionString);
cn.Open();
SqlCommand cmd = new SqlCommand("SELECT DISTINCT LastName + ', ' +
FirstName AS Name,
Person.Contact.ContactID " +
"FROM Sales.SalesOrderHeader " +
"INNER JOIN Person.Contact " +
"ON Sales.SalesOrderHeader.ContactID =
Person.Contact.ContactID " +
"ORDER BY LastName + ', ' + FirstName", cn);
SqlDataReader dr = cmd.ExecuteReader();
ddlCustomer.DataSource = dr;
ddlCustomer.DataTextField = "Name";
ddlCustomer.DataValueField = "ContactId";
ddlCustomer.DataBind();
CrystalReportViewer1.Visible = false;
}
else
{
if (CrystalReportViewer1.Visible == true)
{
//重新绑定报表
BindReport();
}
}
{
//使用数据填充下拉列表框
SqlConnection cn = new SqlConnection(
ConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"].ConnectionString);
cn.Open();
SqlCommand cmd = new SqlCommand("SELECT DISTINCT LastName + ', ' +
FirstName AS Name,
Person.Contact.ContactID " +
"FROM Sales.SalesOrderHeader " +
"INNER JOIN Person.Contact " +
"ON Sales.SalesOrderHeader.ContactID =
Person.Contact.ContactID " +
"ORDER BY LastName + ', ' + FirstName", cn);
SqlDataReader dr = cmd.ExecuteReader();
ddlCustomer.DataSource = dr;
ddlCustomer.DataTextField = "Name";
ddlCustomer.DataValueField = "ContactId";
ddlCustomer.DataBind();
CrystalReportViewer1.Visible = false;
}
else
{
if (CrystalReportViewer1.Visible == true)
{
//重新绑定报表
BindReport();
}
}
上面的代码将使用数据库中客户数据填充下拉列表框控件。为此,你必须在你的网站配置文件web.config中添加必要的数据库连接字符串。例如,在本文示例中,我加入了如下代码(你自己则需要根据具体情况进行调整):
源码清单6
<connectionStrings>
<add name="AdventureWorksConnectionString" connectionString="Data Source=zxzcom;Initial Catalog=AdventureWorks;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<add name="AdventureWorksConnectionString" connectionString="Data Source=zxzcom;Initial Catalog=AdventureWorks;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>