在Visual Studio 2005中使用Crystal Reports(C#.NET Windows应用程序)

Pik*_*iku 9 .net c# database crystal-reports visual-studio

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

有人可以指出我正确的方向来创建报告吗?我似乎无法解决这个问题.一些例子将是一个良好的开端,或一个简单的操作指南...任何真正比MSDN文档更好的解释.

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

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

Pik*_*iku 4

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

简要概述

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

解释

我创建了一个类来保存报告的数据。这个类是我通过手动从数据库中检索数据来手动填充的。如何执行此操作并不重要,但这里有一个示例:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

((CPickingNoteData)rptData[0]).header_date = DateTime.Now;
((CPickingNoteData)rptData[rptData.Count-1]).footer_serial = GenerateSerialNumber();
Run Code Online (Sandbox Code Playgroud)

一旦你有了一个充满数据的数组列表,将其绑定到你的报表查看器,如下所示,其中“rptData”的类型为“ArrayList”

ReportDocument reportDoc = new ReportDocument();
reportDoc.Load(reportPath);
reportDoc.SetDataSource(rptData);
crystalReportViewer.ReportSource = reportDoc;
Run Code Online (Sandbox Code Playgroud)

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

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