首页 > 解决方案 > 使用实体框架在 Crystal Reports 中显示 GridView 的一条记录

问题描述

设想:

我有一个 Gridview,其中包含一些从 SQL 数据库读取的记录,Gridview 的每条记录都有一个按钮,该按钮使用CommandNameCommandArgument发送'<%#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)

先感谢您

标签: c#asp.netentity-frameworkcrystal-reportsentity-framework-6

解决方案


您只需将链接的 href 设置为托管显示报告的水晶报表查看器的页面,并在页面的页面加载中,使用您从查询字符串或路由收到的实体 ID 设置数据源。

带有实体框架的水晶报表 - 将数据传递给报表

  1. 创建 ASP.NET WebForms 项目
  2. 添加一个新的数据库到App_Data文件夹,命名它SampleDatabase
  3. 向示例数据库添加一个新表,将其命名为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
    )
    
  4. 向表中添加一些记录。(否则不会显示 GridView)。

  5. 将新的实体数据模型添加到您的项目并命名SampleDatabase
  6. 使用以下配置创建一个新的页面名称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>
    
  7. 将数据加载到网格中,在后面的代码中:

    protected void Page_Load(object sender, EventArgs e)
    {
        using (var db = new SampleDatabaseEntities())
        {
            var data = db.Prodcts.ToList();
            GridView1.DataSource = data;
            GridView1.DataBind();
        }
    }
    
  8. 向项目中添加一个新的 Crystal Report,将其命名为ProductReport

    • 添加新项目 → Crystal Reports → 使用报表向导/标准
    • 然后从可用数据源:→项目数据→.NET对象→查找并选择产品并将其添加到右侧面板
    • 然后按照向导
  9. 使用默认名称添加一个名为的新页面并将Report.aspx的实例拖放到该页面。ReportViwerCrystalReportViewer1

  10. 在后面的代码中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();
            }
        }
    }
    

注意:如果您有一些脚本错误阻止报告查看器显示,您可以将C:\inetpub\wwwroot\aspnet_client文件夹复制到您的项目。


推荐阅读