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

标签 c# .net database visual-studio crystal-reports

我需要在 C# .NET Windows 应用程序中创建报告。我有一个 SQL Server 2005 数据库和 Visual Studio 2005,并且非常擅长创建存储过程和数据集。

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

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

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

最佳答案

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

简要概述

它的工作原理是有一个“数据类”,它只是一个包含变量但没有代码的常规 C# 类。然后将其实例化并填充数据,然后放置在 ArrayList 中。 ArrayList 与要加载的报表名称一起绑定(bind)到报表查看器。在报表设计器中使用“.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);
}

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

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

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

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

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

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

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

关于c# - 在 Visual Studio 2005 中使用 Crystal Reports(C# .NET Windows 应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/164621/

相关文章:

c# - 在没有格式和 IFormatProvider 的情况下使用 Int32.ToString()。为什么我会收到 CA1305 警告?

c# - 从多个线程写入 TraceListener

c# - 脚手架 EntityFramework 6 无法将类型为 'System.Data.Entity.Core.Objects.ObjectContext' 的对象转换为 'System.Data.Objects.ObjectContext'

sql - H2 - 如何截断所有表?

android - 奇怪的数据库错误: Empty values?

c# - 在 .NET 4.5 中是否有更好的方法将变量名称作为字符串获取?

c# - 在 C# 中使用指针

c# - 在Redis中存储带有DateTime键的对象

c# - Json.NET 保留 native 类型

mysql - 将 .NET 应用程序连接到 MySQL