1

我尝试使用下面的代码,但它不起作用。

ReportDataSet我使用 SQL 查询将报告数据存储在 a中。后来我将此设置为ReportDataSet对象。DataSourceCrystalReport

private void btnGenReport_Click(object sender, EventArgs e)
    {
        CrystalReport1 objRpt = new CrystalReport1();

        string sql; //creating sql query
        sql = "SELECT invoice.InvoiceNo, invoice.Date, invoiceitems.Name, invoice.InvoiceTo, invoice.CusName, invoiceitems.Qty, invoiceitems.Rate, invoiceitems.Amount ";
        sql += "FROM (invoice INNER JOIN invoiceitems ON invoice.Date = invoiceitems.Date) ";
        sql += "WHERE (invoice.Date BETWEEN '" + DateTimePickerFrom.Value + "' AND '" + DateTimePickerTo.Value + "');";

        ReportDataSet ds = new ReportDataSet();
            string path = Application.StartupPath + "\\";
        string conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + path + "SMS_DB.mdf;Integrated Security=True;User Instance=True";
        SqlConnection con = new SqlConnection(conStr); // create connection
        try
        {
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter(sql, con);
            da.Fill(ds, "InvoiceItemData");
            objRpt.SetDataSource(ds.Tables["InvoiceItemData"]);
            crystalReportViewer1.ReportSource = objRpt;
            con.close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error ! \n" + ex.ToString());
        }
    }
4

1 回答 1

1

我将假设一些事情:

  1. 您的项目正在使用 Visual Studio 2010、.NET Framework 4 和 VS2010 的 Crystal Reports 运行时
  2. 您的类型化数据集ReportDataSet是使用 VS 的数据集设计器通过连接到您的数据库文件 SMS_DB.mdf 设置的,并且该文件中已有数据
  3. 您的类型化 Crystal Reportrt1是在报表设计器中设置的,数据源是项目InvoiceItemData中类型化数据集中的表ReportDataSet
  4. 所有这些控件都在同一个表单上
  5. 您仍在安装 .NET Framework 4 和 Crystal Reports 运行时 for VS2010 的机器上调试它

换句话说,我假设您已经设置了所有内容,btnReportGen在最新的非 beta 环境中单击按钮之前,您已经完成了所有操作,并且您没有尝试将其运行为a 在另一台机器上发布。

现在,我有一些建议和澄清要向您提出。

  1. 在这种情况下,您没有使用类型化数据集作为报表数据源:数据集是您的数据服务,数据源是您的类型化数据表,这就是您在代码中正确发送报告更新数据表的原因。
  2. 为您的选择器控件和报表查看器使用单独的 winform,并在您点击生成按钮时从您的选择器控件表单中调用您的报表查看器表单。否则,您将遇到向报表查看器发送错误数据的问题,这将生成不正确的报表或根本不生成报表。
  3. 在您的报表文档中使用参数并将选取器控件值发送到报表文档,以便您可以在报表上显示它们,以便您的用户知道当他们点击生成按钮时他们至少发送了正确的值。
  4. 在将控件值发送到查看器表单并在查询中使用它们之前,请检查它们是否有效。需要检查的一些事情:它们都设置了吗?他们俩都是约会吗?To 值是否大于或等于 From 值?该范围对您的数据库有效吗?(这也使您可以选择向用户显示更有用的错误消息,并能够将它们发送回正确的控件,以便他们可以修复它。)
  5. 由于您已经在使用类型化数据集和数据集设计器,因此请使用提供的类型化表适配器并在设计器中使用参数创建自定义查询,然后使用该查询来填充您的表。这将为您省去许多因尝试以编程方式完成所有事情而引起的头痛。你有可用的工具,所以使用它们。

如果您考虑以上所有因素,我认为您会发现自己的项目工作正常。但是,如果您仍然卡住,我可以仔细阅读每个建议,并通过屏幕截图和示例代码帮助您修复所有问题。如果您需要我这样做也没关系,因为我在 VS2010 中创建了种类繁多的 Crystal Report 项目,我只是根据经验告诉您,作为程序员和用户,什么最适合您。您可能认为只需以编程方式输入所有内容并将其扔给报表查看器即可节省时间和资源,但这也是它不合作的原因。

于 2012-07-26T14:21:12.533 回答