如何在Winform应用程序中生成产品收据?

时间:2019-04-01 11:29:04

标签: c# winforms crystal-reports rdlc

我是第一次使用Winform应用程序,我有一个gridview,其中包含用户购买的产品列表。

我在单击时有一个“打印”按钮,该按钮使用户可以生成类似于以下内容的收据:

enter image description here

因此,在这里我感到困惑,是应该使用“ winform默认RDLC还是Crystal Report”,还是应该生成PDF,然后将其作为收据打印出来,但是我不确定PDF是生成收据还是一个不错的选择。不是。

对于Crystal Report,我已经读到我需要安装它,而客户端(将使用此桌面应用程序的客户端)必须安装Crystal Report,并且我不希望使用Crystal Report涉及一些许可。

如果我使用Crystal Report,那么我不确定是否可以生成上面的收据(表格格式),并且会很复杂吗?

收据有点复杂,所以有没有更好的工具或方法,或者应该如何生成上图中显示的收据?

更新: 打印纸的总尺寸为:7.50厘米,用户希望将所有内容打印在中间。

Discount = FinalAmount - MRP;

客户名称,手机号码,账单号,付款方式值由用户自己输入。

我有一个包含产品列表的Excel文件,对于每个产品,我都有诸如 ProductId,ProductName,MRP,税收信息(如CGST,SGST )之类的信息。

根据产品ID从Excel文件填充gridview的代码:

 using (OleDbConnection cnnxls = new OleDbConnection(strConn))
                    using (OleDbDataAdapter oda = new OleDbDataAdapter(query, cnnxls))
                    {
                        oda.Fill(dtProductList);
                        DataColumnCollection columns = dtProductList.Columns;
                        if (!columns.Contains("FinalAmount"))
                        {
                            dtProductList.Columns.Add(new DataColumn() { ColumnName = "FinalAmount", DataType = typeof(decimal) });
                        }

                        if (!columns.Contains("Quantity"))
                        {
                            dtProductList.Columns.Add(new DataColumn() { ColumnName = "Quantity", DataType = typeof(int) });
                        }
                        DataRow lastRow = dtProductList.Rows[dtProductList.Rows.Count - 1];
                        lastRow["FinalAmount"] = Convert.ToDecimal(lastRow["MRP"]);
                        lastRow["Quantity"] = 1;
                    }

enter image description here

4 个答案:

答案 0 :(得分:4)

生成并打印收据

您可以使用任何报表设计器工具(如RDLC报表或Crystal报表)来生成报表。 RDLC报告足够好。您可以print the RDLC report with or without showing the print dialog。您也可以轻松export the RDLC report manually or using the code

如果出于任何原因您不想使用报告工具,则可以考虑使用generating HTML report easily using Run-time T4 templates作为另一种选择。

使用RDLC报告,如何在单个单元格中显示多个字段

您可以轻松地使用表达式在单个单元格中显示多个值。另外,您也可以在单个行组中使用行,并在单个列中显示不同的字段。

示例1-RDLC-使用表达式在单个列中显示多个字段

以下步骤显示了如何使用表达式在单个列中显示多个字段。我假设您已经设置了数据源,并且具有ProductNameUnitPriceQuantity字段。然后,请按照下列步骤操作:

  1. 从报表设计图面上的工具箱中拖放Table
  2. 在第一列第一数据行(而不是标题行)中,右键单击并选择ProductNameimage
  3. 选择第二列的标题,然后输入UnitPrice/Quantityimage
  4. 在第二列第一数据行中,右键单击并选择Expression。 (image
  5. 在表达式窗口中,输入所需的表达式,例如:

    = "UnitPrice: " & Fields!UnitPrice.Value.ToString() & System.Environment.NewLine & "Quantitye: " & Fields!Quantity.Value.ToString()

示例2-RDLC-使用行组在单个列中显示多个字段

以下步骤显示了如何在单个列中显示多个字段。我假设您已经设置了数据源,并且具有ProductNameUnitPriceQuantity字段。然后,请按照下列步骤操作:

  1. 从报表设计图面上的工具箱中拖放Table
  2. 在第一列第一数据行(而不是标题行)中,右键单击并选择ProductNameimage
  3. 选择第二列的标题,然后输入UnitPrice/Quantityimage
  4. 右键单击第一个数据行的行标题,然后选择Insert RowInside Group - Belowimage
  5. 在第二列第一数据行中,右键单击并选择UnitPrice。 (image
  6. 单击[UnitPrice],然后按 Home 并键入UnitPrice:image
  7. 对组中的下一行中的“数量”执行相同的操作。
  8. 如果您需要组中的另一行,请重复步骤3。 您可以通过选择单元格的边框并分别为顶部,左侧,底部和右侧设置BorderStyle来设置单元格的边框。

下载

您可以在此处使用表达式克隆或下载示例:

答案 1 :(得分:1)

RDLC和Crystal报表一样强大。您可以选择rdlc,它可以消除许可成本。

使用RDLC

数据 您需要将数据集Here或数据源添加到报表中,您将对其进行操作以符合所需的设计和数据。

设计 在设计时,只需拖放控件即可。面临的挑战是,有时您在设计中看到的可能与最终输出中看到的不一样,因此您需要进行大量测试。

打印 您可以使用rdlc放置打印预览或直接发送到pdf查看器。 Here是一个示例。

结论 我认为,如果您在报表上生成的数据很好,那么使用rdlc和crystal报表都不会对设计和布局造成太大的问题。

更新 根据提供的更多信息,我已尝试做一些可能与您想要实现的目标接近的事情。 由于时间的关系,我使用了水晶报表以及数据库表进行模拟。否则,可以使用rdlc达到相同的目的。

我创建的样本表 enter image description here

这是示例查询和来自数据库的结果。我已经组成了水晶报告可以容纳的小组。您可以使用相同的文本值来计算税款信息和交易记录之间的区别。 enter image description here

这是调整设计后的最终外观。页面布局也可能会根据您的喜好进行调整。

更新。 对于RDLC,我认为您需要添加备注数据和税收信息的数据集。如果距离最近,请看下面的内容。我无法预览未安装的组件。 enter image description here

enter image description here

答案 2 :(得分:1)

我之前使用的一种快速简便的方法是生成一个html页面,然后使用html2pdf库将其转换为pdf文件。

您也可以考虑采用这种方法,因为RDLC报告/ Crystal报告可能对您的情况有些过分。

答案 3 :(得分:1)

在一个单元格中添加3列 您有两种选择:

1-使用换行符

=Fields!MyField1.Value + System.Environment.NewLine + Fields!MyField2.Value

2-在rdlc中使用子报告或分组之类的东西。

第一个选项更容易接缝