我有一个Gridview,其中包含一些从SQL数据库读取的记录,Gridview的每个记录都有一个按钮,该按钮使用CommandName
和CommandArgument
发送'<%#Eval("UserId")%>'
来检测每个记录,并在后面的代码(CS)中进行调用。
当我单击按钮(DO_PRINT(LinkButton)
)时,我想使用实体命令,弹出的水晶报表将显示相同记录的内容。
UserId Name LastName OfficeId Print
100 Hassan Hosseini 1 DO_PRINT(LinkButton)
200 Brad Pitt 2 DO_PRINT(LinkButton)
[您只需要将链接的href设置为托管显示报告的Crystal Report查看器的页面,并在页面的页面加载中,使用从查询字符串或路由接收的实体ID设置数据源。
App_Data
文件夹,将其命名为SampleDatabase
向示例数据库添加新表,将其命名为Products
:
CREATE TABLE [dbo].[Prodcts]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
[Name] NVARCHAR(50) NOT NULL,
[Price] INT NOT NULL,
[Description] NVARCHAR(500) NULL
)
向您的项目添加一个新的实体数据模型并将其命名为SampleDatabase
(我使用EF 6.x,设置为复数/唯一名称)
使用以下配置创建一个新的页面名称Products.aspx
并将新的GridView
添加到该页面:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name"/>
<asp:BoundField DataField="Price" HeaderText="Price"/>
<asp:BoundField DataField="Description" HeaderText="Description"/>
<asp:HyperLinkField
DataNavigateUrlFields="Id"
DataNavigateUrlFormatString="~\Report.aspx?Id={0}"
HeaderText="Report"
Text="Report" />
</Columns>
</asp:GridView>
将数据加载到网格中,在后面的代码中:
protected void Page_Load(object sender, EventArgs e)
{
using (var db = new SampleDatabaseEntities())
{
var data = db.Prodcts.ToList();
GridView1.DataSource = data;
GridView1.DataBind();
}
}
向项目添加一个新的Crystal Report,将其命名为ProductReport
:
添加一个名为Report.aspx
的新页面,并使用默认名称ReportViwer
将CrystalReportViewer1
的实例拖放到该页面。
在Report.aspx
后面的代码中,获取报告和要在报告中显示的数据:
protected void Page_Load(object sender, EventArgs e)
{
if (int.TryParse(Request.QueryString["id"], out int id))
{
using (var db = new SampleDatabaseEntities())
{
var report = new ProductReport();
var data = db.Prodcts.Where(x => x.Id == id).ToList();
report.SetDataSource(data);
CrystalReportViewer1.ReportSource = report;
CrystalReportViewer1.RefreshReport();
}
}
}