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

Posted

技术标签:

【中文标题】如何在winform应用程序中生成产品收据?【英文标题】:How to generate product receipt in winform application? 【发布时间】:2019-08-22 13:23:00 【问题描述】:

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

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

所以在这里我很困惑是否应该使用“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;
                    

【问题讨论】:

您可以使用 RDLC 报告。可以打印 PDF、WORD、EXCEL。 我想直接生成这张收据,而不是在 PDF/Word/Excel 中进一步导出 您可以使用任何报表设计器工具生成如上图所示的报表。 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。 @RezaAghaei 非常感谢您的回复和建议选项,但我不明白的一件事是,如果您能看到我的表格结构,我在 1 列中有 MRP、QTY、DISC,那么我该如何满足是吗? 【参考方案1】:

生成并打印收据

您可以使用任何报表设计器工具(如 RDLC Reports 或 Crystal Reports)来生成报表。 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 字段。然后,按照以下步骤操作:

    从报表设计图面上的工具箱中删除Table。 在第一列第一个数据行(不是标题行),右键选择ProductName(image) 选择第二列的标题并输入UnitPrice/Quantity (image) 在第二列第一个数据行中,右键单击并选择Expression。 (image)

    在表达式窗口中,输入所需的表达式,例如:

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

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

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

    从报表设计图面上的工具箱中删除 Table。 在第一列第一个数据行(不是标题行),右键选择ProductName(image) 选择第二列的标题并输入UnitPrice/Quantity (image) 在第一个数据行的行头上右击选择Insert RowInside Group - Below(image) 在第二列第一个数据行中,右键单击并选择UnitPrice。 (image) 点击[UnitPrice],然后按Home并输入UnitPrice: (image) 对组中的下一行中的数量执行相同操作。 如果您需要组中的另一行,请重复步骤 3。 您可以通过选择单元格并分别设置BorderStyle 为顶部、左侧、底部和右侧来设置单元格的边框。

下载

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

repository zip file

【讨论】:

赞成详细编写步骤,但对于第一列,即详细信息/HSN,我想在其中显示 3 个字段的值,即 ProductId、ProductName、HSN 所以我声明了所有这 3 个属性(ProductId、ProductName、HSN ) 在我的数据集的数据表中? 可以对第一列执行相同的步骤,使用表达式或使用行组。 我已将 RDLC 报告中生成的表格发送给您,并按照您在聊天中的步骤进行操作,因为我无法在评论中向您发送屏幕截图,所以 @Learning-Overthinker-Confused 我在 github 中创建了一个示例。您可以克隆/下载它以更好地了解解决方案。 是的,我已经下载了它,它可以很好地处理表达式,但边框没有出现,正如您在此处看到的那样:i.stack.imgur.com/poFGb.png【参考方案2】:

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

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

【讨论】:

如果您出于某种原因不想使用报告工具,可以考虑generating HTML report easily using Run-time T4 templates作为另一种选择。 为您为帮助我而付出的努力以及您宝贵的时间点赞。感谢 :)【参考方案3】:

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

使用 RDLC

数据 您需要将数据集Here 或数据源添加到您将操作的报告中以满足您想要的设计和数据。

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

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

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

更新 根据提供的进一步信息,我试图做一些可能接近你想要实现的事情。 由于时间关系,我使用了水晶报表和数据库表来模拟。否则,使用 rdlc 也可以达到同样的效果。

我创建的示例表

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

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

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

【讨论】:

但是如何在收据中显示的 1 列中显示 MRP、QTY、DISC? 如果它们来自数据库,这很容易。您可能需要将 MRP、QTY、DISC 连接为单个字符串,以便每一行都带有 3(MRP、QTY、DISC)。如果有样本数据,我会尝试。例如,在报告的备忘录表上,我认为可以运行生成前 3x3 列的数据库查询。 如果报告接近您的预期,请检查答案。我尝试使用水晶报表并从表格中获取数据,尽管某些数据可能无法根据您的需要正确计算。 感谢您为我所做的所有工作,但我没有使用水晶报表。我目前正在尝试使用 RDLC 进行这项工作,因为水晶报表需要许可证 你能帮我用 RDLC 实现这个吗?【参考方案4】:

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

1- 使用换行表达式

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

2- 在 rdlc 中使用子报表或分组。

第一个选项更容易接缝

【讨论】:

赞成您为帮助我所做的努力。我希望在查看器的中心生成此收据。纸张尺寸为 7.30 厘米,我希望在中心打印内容。可以吗?跨度> 确保您可以调整报告的大小,您有两种宽度 1- 报告宽度。 2- 可以从报表设计器属性窗格中导航的正文宽度 哪个报告宽度?Reportviewer 或 rdlc 报告宽度? rdlc宽度如果要打印报表直接reportviewer不必参与 我在这里问过问题:***.com/questions/55633350/…

以上是关于如何在winform应用程序中生成产品收据?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地查询多个表以在 dataGrid 中生成 excel STYLE 报告

Winform中生成自动控件

iOS 7:应用内购买收据验证和验证

winform 自定义控件

尝试在 C# 中生成按钮

如何使用 Mac OSX 在 Python 中生成线程和初始化 Qt 应用程序