9

我需要在 C# .NET Windows 应用程序中创建报告。我有一个 SQL Server 2005 数据库、Visual Studio 2005,并且可以很好地创建存储过程和数据集。

有人可以指出我创建报告的正确方向吗?我只是似乎无法解决。一些示例将是一个好的开始,或者是一个简单的操作指南……任何比 MSDN 文档解释得更好的东西。

我正在使用 CrystalDecisions.Windows.Forms.CrystalReportViewer 控件来显示报告,我认为这是正确的。

如果我即将踏上漫长而复杂的旅程,创建和显示也可以打印的报告的最简单方法是什么?

4

9 回答 9

4

我现在已经成功地完成了这项工作。

简要概述

它的工作原理是拥有一个“数据类”,它只是一个包含变量且没有代码的常规 C# 类。然后将其实例化并填充数据,然后放置在 ArrayList 中。ArrayList 与要加载的报表名称一起绑定到报表查看器。在报表设计器中使用“.Net Objects”,而不是与数据库通信。

解释

我创建了一个类来保存我的报告的数据。这个类是由我通过手动从数据库中检索数据来手动填充的。你如何做到这一点并不重要,但这里有一个例子:

DataSet ds = GeneratePickingNoteDataSet(id);
foreach (DataRow row in ds.Tables[0].Rows) {
    CPickingNoteData pickingNoteData = new CPickingNoteData();

    pickingNoteData.delivery_date = (DateTime)row["delivery_date"];
    pickingNoteData.cust_po = (int)row["CustomerPONumber"];
    pickingNoteData.address = row["CustomerAddress"].ToString();
    // ... and so on ...

    rptData.Add(pickingNoteData);
}

然后将该类放入 ArrayList 中。arraylist 中的每个元素对应于完成报告中的一个“行”。

列表中的第一个元素也可以保存报表页眉数据,列表中的最后一个元素可以保存报表页脚数据。因为这是一个 ArrayList,所以可以使用普通的 Array 访问来获取它们:

((CPickingNoteData)rptData[0]).header_date = DateTime.Now;
((CPickingNoteData)rptData[rptData.Count-1]).footer_serial = GenerateSerialNumber();

一旦你有一个充满数据的数组列表,像这样将它绑定到你的报表查看器,其中“rptData”的类型是“ArrayList”

ReportDocument reportDoc = new ReportDocument();
reportDoc.Load(reportPath);
reportDoc.SetDataSource(rptData);
crystalReportViewer.ReportSource = reportDoc;

现在您需要将数据类绑定到报表本身。您在设计器内部执行此操作:

  1. 打开“字段资源管理器”选项卡(可能位于“查看”菜单下),然后右键单击“数据库字段”
  2. 点击“项目数据”
  3. 单击“.NET 对象”
  4. 向下滚动列表以找到您的数据类(如果不存在,请编译您的应用程序)
  5. 按“>>”然后确定
  6. 您现在可以将班级成员拖到报告中并根据需要进行排列。
于 2008-11-10T19:39:06.550 回答
3

Crystal 是创建报告的一种可能选项。它已经存在了很长时间,似乎很多人都喜欢它。

您可能想看看 SQL 报告服务。我都使用过,但我更喜欢 SQL 报告服务。它很好地集成到工作室中,并且与其他微软项目类似。它也可以通过 sql express 等免费使用。

这是一篇关于开始报告服务的好文章: http ://www.simple-talk.com/sql/learn-sql-server/beginning-sql-server-2005-reporting-services-part-1/

于 2008-10-02T21:19:55.047 回答
2

您可以将报表查看器与内置于 vs.net 的客户端报表一起使用(ReportBuilder/ReportViewer 控件)。您可以像创建 sql 报告服务一样创建报告,但不需要 sql server(也不需要 asp.net)。另外,您可以完全控制它们(如何呈现、如何收集数据、生成它们的层、生成后如何处理它们,例如邮寄、发送到 ftp 等)。您还可以导出为 PDF 和 Excel。

在您的情况下,根据数据和用户输入构建报告,这可能会很好,因为您可以在进行过程中构建自己的数据源和数据。准备好报告数据后,将其绑定到您的报告。

报表可以很容易地在 Visual Studio 2005 中构建(将报表添加到您的项目),并使用 ReportViewer 控件显示在 Winforms 应用程序中。

如果对客户端报告感兴趣,我推荐给大家看看这是一本很棒的书。它提供了很多很棒的信息以及许多不同的场景和使用客户端报告的方法。

http://www.apress.com/book/view/9781590598542

于 2008-10-03T05:34:02.520 回答
1

我赞同 alex 的建议,看看 sql 报告服务 - 如果您有 sql 开发人员许可证,那么您可能已经有报告服务

我不喜欢水晶报告,设计器太乏味(一直在编辑表达式)太多服务器部署问题(检查那些许可证文件!)

于 2008-10-02T21:22:23.357 回答
1

我用水晶。我将简要概述我的方法,但请注意,我是一家单人店,它可能无法转化为您的环境。

首先,使用 CR 查看器创建一个表单。然后:

1) 找出您需要的数据,并创建一个检索所需列的视图。2) 使用向导创建一个新的 Crystal 报表,将您的视图作为数据源。3)拖放,插入,删除,以及任何使您的报告粗略成形的东西。是的,这很乏味。4)创建必要的按钮点击或其他,并创建生成报告的功能。5) 将数据检索到 DataTable(可能在 DataSet 中)。您不必使用视图。6) 创建报表对象。将 DataTable 设置为 DataSource。将报告对象分配给 CR 查看器。这是有例子的一部分。

评论:

如果您丢失了带有数据库字段等的窗口(字段资源管理器),请转到查看/文档大纲。(让比尔盖茨站在舞台上并让他找到它是我的幻想。)

设置视图的原因是,如果要添加列,则修改视图,字段资源管理器将自动更新。我在其他方面遇到了各种各样的麻烦。此方法也是解决需要扫描所有表以重置它们指向的表的错误的解决方法。你想递给水晶一张桌子。您不想尝试让 Crystal 加入表格等。我并不是说它不起作用;我说更难。

Business Objects 网站上有(或曾经有)Crystal 的 VS 实现的文档,但我相信它已经消失在注册/登录屏幕后面。(我自己可以了解更多信息。)

我很难让 Crystal 在我想要的时候分页,而不是在我不想要的时候分页等等。它远非我用过的最好的报告编写器,我不明白为什么它似乎已经放这么多人倒闭。此外,他们的许可政策很难在一个小型、流动的组织中处理。

编辑添加示例:

AcctStatement oRpt = new AcctStatement() ;
oRpt.Database.Tables[0].SetDataSource(dsRpt.Tables[0]);
oRpt.SetParameterValue("plan_title",sPlanName) ;
crViewer.ReportSource = oRpt ;
于 2008-10-02T23:16:47.637 回答
1

我发现以下网站解决了我的问题。包括在此处以供将来参考。

CrystalReportViewer 对象模型教程关于如何使整个事情工作的教程。并且还设置一个项目以使用 Crystal Reports 并专门准备表单添加控件

于 2008-10-13T19:27:51.353 回答
1

我认为这可能会帮助你 http://infynet.wordpress.com/2010/10/06/crystal-report-in-c/

于 2010-10-07T18:16:00.803 回答
0

我强烈建议尝试另一种报告解决方案——我在 Crystal 方面有很多经验,并且已经设法在 .Net 中用它做一些时髦的事情,但老实说,Crystal 和 .Net 的集成对于任何事情来说都是绝对的猪,除了最简单的情况。

于 2008-10-24T11:12:15.967 回答
0

我试过RS。我正在从 RS 转换回 Crystal。RS太重太慢(或其他东西)。当 Crystal 在不到一秒的时间内完成报告时,没有理由必须等待 30 秒才能呈现 RS。

于 2011-09-14T11:29:55.240 回答