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

How to generate product receipt in winform application?

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

我有一个点击打印按钮,允许用户生成如下所示的收据:

所以在这里我很困惑我是否应该使用 "winform default RDLC or Crystal Report" 或者我是否应该生成 PDF 然后让它作为收据打印出来,但我不确定 PDF 是否是生成收据的好选择.

对于 Crystal 报告,我读到我需要安装它,客户端(将使用此桌面应用程序的人)必须安装 Crystal 报告并且还涉及一些许可 Crystal我不想举报

此外,如果我使用 Crystal 报告,那么我不确定是否可以生成恰好在上面的收据(使用 table 格式)并且会很复杂吗?

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

更新: 打印纸总尺寸为: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;
                    }

RDLC 和 Crystal 报告一样强大。您可以选择在消除许可成本方面接近的 rdlc。

使用 RDLC

数据 您需要向报告中添加数据集 Here 或数据源,您将对其进行操作以满足所需的设计和数据。

设计 在设计上,您只需根据自己的喜好拖放控件即可。有一个挑战,有时您在设计中看到的可能不是您在最终输出中看到的,因此您需要进行大量测试。

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

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

更新 根据提供的更多信息,我尝试做一些可能接近您想要实现的事情。 由于时间关系,我使用了 crystal 报告以及数据库 table 来模拟。否则同样可以使用 rdlc 来实现。

我创建的样本table

这是来自数据库的示例查询和结果。我创建了可以容纳 crystal 报告的组。您可以使用相同的计算文本值来区分税务信息和交易备忘录。

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

更新。 对于 RDLC,我认为您需要为备忘录数据和税务信息添加数据集。如果接近,请查看下面的内容。我没有进行预览,因为有些组件我没有安装。

生成并打印收据

您可以使用任何报表设计器工具(如 RDLC 报表或 Crystal 报表)生成报表。 RDLC 报告已经足够好了。你可以 print the RDLC report with or without showing the print dialog. You can also easily 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. 在第一列第一数据行(不是 header 行),右击并选择 ProductName (image)
  3. Select 第二列的 header 并键入 UnitPrice/Quantity (image)
  4. 在第二列第一数据行中,右键单击并选择 Expression。 (image)
  5. 在表达式window中输入需要的表达式,例如:

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

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

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

  1. 从报表设计图面上的工具箱中拖放 Table
  2. 在第一列第一数据行(不是 header 行),右击并选择 ProductName (image)
  3. Select 第二列的 header 并键入 UnitPrice/Quantity (image)
  4. 右击第一个数据行的header行,选择Insert RowInside Group - Below(image)
  5. 在第二列第一数据行中,右键单击并选择 UnitPrice。 (image)
  6. 单击 [UnitPrice],然后按 主页 并键入 UnitPrice: (image)
  7. 在组的下一行中对数量执行相同的操作。
  8. 如果您需要组中的另一行,请重复步骤 3。 您可以设置单元格的边框,方法是选择它们并分别为顶部、左侧、底部和右侧设置 BorderStyle

下载

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

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

您也可以考虑这种方法,因为 RDLC reports/Crystal 报告对您的案例来说可能有点过分了。

用于在一个单元格中添加 3 列 你有两个选择:

1- 使用换行表达式

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

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

第一个选项接缝更容易