C# WPF PrintDialog 打印(3)

news/2025/3/1 8:19:31/文章来源:https://www.cnblogs.com/yinyu5/p/18634133

前面https://www.cnblogs.com/yinyu5/p/18634080使用PrintDocument方法打印了Canvas,这里打印下面的DataGrid列表内容:

这里DataGrid的数据源是DataTable,后台代码:

  1 private void PrintDocument_DataTable_Method(string Title, DataTable dataTable)
  2         {
  3             PrintDialog printDialog = new PrintDialog();
  4             printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
  5             printDialog.PageRangeSelection = PageRangeSelection.AllPages;
  6 
  7             if (printDialog.ShowDialog() == true)
  8             {
  9                 FixedDocument fixedDoc = new FixedDocument();
 10                 Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
 11                 double offsetLeft = 20;
 12                 double titleHeight = 30;
 13                 double titleMargin = 5;
 14                 double rectHeight = 5;
 15                 double rectMargin = 5;
 16                 double rowHeight = 20;
 17                 double columnHeight = 18;
 18                 double columnBorderThickness = 1;
 19                 double cellThickness = 1;
 20                 int cellWidth = 100;
 21                 BrushConverter brushConverter = new BrushConverter();
 22                 Brush columnBackgrouneBrush = (Brush)brushConverter.ConvertFromString("#D3DBDE");
 23                 Brush borderBrush = (Brush)brushConverter.ConvertFromString("#8BA2AF");
 24                 int totalRows = dataTable.Rows.Count;
 25                 int totalColumns = dataTable.Columns.Count;
 26                 //计算页数
 27                 int rowsPerPage = (int)((pageSize.Height - offsetLeft - (titleHeight + 2 * titleMargin) - (rectHeight + rectMargin * 2) - (columnHeight + 2 * columnBorderThickness))
 28                     / (rowHeight + 2 * cellThickness));
 29                 int totalPages = (totalRows + rowsPerPage - 1) / rowsPerPage;
 30 
 31                 for (int pageIndex = 0; pageIndex < totalPages; pageIndex++)
 32                 {
 33                     PageContent pageContent = new PageContent();
 34                     FixedPage fixedPage = new FixedPage();
 35                     fixedPage.Width = pageSize.Width;
 36                     fixedPage.Height = pageSize.Height;
 37                     //总布局
 38                     StackPanel stackPanel_Total = new StackPanel();
 39                     stackPanel_Total.Orientation = Orientation.Vertical;
 40                     stackPanel_Total.Width = pageSize.Width;
 41                     // 添加标题
 42                     TextBlock title = new TextBlock
 43                     {
 44                         Text = Title,
 45                         FontSize = titleHeight,
 46                         FontWeight = FontWeights.Bold,
 47                         Margin = new Thickness(titleMargin),
 48                         HorizontalAlignment = HorizontalAlignment.Center
 49                     };
 50                     stackPanel_Total.Children.Add(title);
 51                     //添加长方形横杠
 52                     Rectangle rectangle = new Rectangle
 53                     {
 54                         Height = rectHeight,
 55                         Fill = System.Windows.Media.Brushes.Black,
 56                         Margin = new Thickness(rectMargin)
 57                     };
 58                     stackPanel_Total.Children.Add(rectangle);
 59                     // 添加列名
 60                     StackPanel stackPanel = new StackPanel();
 61                     stackPanel.Orientation = Orientation.Horizontal;
 62                     stackPanel.Margin = new Thickness(offsetLeft, 0, 0, 0);
 63                     for (int i = 0; i < totalColumns; i++)
 64                     {
 65                         TextBlock columnName = new TextBlock
 66                         {
 67                             Text = dataTable.Columns[i].ColumnName,
 68                             Foreground = System.Windows.Media.Brushes.Black,
 69                             FontWeight = FontWeights.Bold,
 70                             FontSize = columnHeight,
 71                             Width = cellWidth,
 72                             TextWrapping = TextWrapping.Wrap
 73                         };
 74                         Border border = new Border
 75                         {
 76                             BorderBrush = borderBrush,
 77                             Background = columnBackgrouneBrush,
 78                             BorderThickness = new Thickness(columnBorderThickness, columnBorderThickness, columnBorderThickness, columnBorderThickness)
 79                         };
 80                         border.Child = columnName;
 81                         stackPanel.Children.Add(border);
 82                     }
 83                     stackPanel_Total.Children.Add(stackPanel);
 84                     //添加DataTable的行内容
 85                     StackPanel stackPanel_Ver = new StackPanel();
 86                     stackPanel_Ver.Orientation = Orientation.Vertical;
 87                     stackPanel_Ver.Margin = new Thickness(offsetLeft, 0, 0, 0);
 88                     for (int rowIndex = pageIndex * rowsPerPage; rowIndex < (pageIndex + 1) * rowsPerPage && rowIndex < totalRows; rowIndex++)
 89                     {
 90                         StackPanel stackPanel_Hor = new StackPanel();
 91                         stackPanel_Hor.Orientation = Orientation.Horizontal;
 92                         for (int i = 0; i < totalColumns; i++)
 93                         {
 94                             TextBlock columnCell = new TextBlock
 95                             {
 96                                 Text = dataTable.Rows[rowIndex][i].ToString(),
 97                                 FontSize = 15,
 98                                 Width = cellWidth,
 99                                 TextWrapping = TextWrapping.Wrap
100                             };
101                             Border columnCell_Border = new Border
102                             {
103                                 BorderBrush = borderBrush,
104                                 BorderThickness = new Thickness(columnBorderThickness, columnBorderThickness, columnBorderThickness, columnBorderThickness)
105                             };
106                             columnCell_Border.Child = columnCell;
107                             stackPanel_Hor.Children.Add(columnCell_Border);
108                         }
109                         stackPanel_Ver.Children.Add(stackPanel_Hor);
110                     }
111                     stackPanel_Total.Children.Add(stackPanel_Ver);
112                     fixedPage.Children.Add(stackPanel_Total);
113                     ((IAddChild)pageContent).AddChild(fixedPage);
114                     fixedDoc.Pages.Add(pageContent);
115                 }
116                 // 开始打印
117                 printDialog.PrintDocument(fixedDoc.DocumentPaginator, "打印 DataGrid");
118             }
119         }
View Code

打印出来的PDF文件效果如下:

 这里使用了StackPanel和Border组合简单实现了类似于表格的样式,个人可根据实际的需要进行布局调整。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859436.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA代码审计】记一次某java类的cms最最最详细的代码审计

前言 刚好遇到一个授权的渗透是通过该cms实现getshell,所以顺便审计一下java类的cms,这个管理系统是一个内容管理系统,下载地址 https://gitee.com/oufu/ofcms/tree/V1.1.3/tomcat下载地址 https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78-wind…

12.26日每日总结

昨天在调试51单片机的串口时,发现芯片手册上有一句话,在使用定时器1产生串口的波特率时,定时器1就不能使能了。不是不能用,是直接不让使能了,使能后会出错,导致发送的数据不稳定。 今天继续研究了触摸滑条,发现滑条输出的值为从小到大,如下图所示的样子,这就导致从最上…

Minio使用教程

Minio MinIO 是一个高性能的对象存储服务器,用于构建云存储解决方案。它使用Golang编写,专为私有云、公有云和混合云环境设计。它是兼容Amazon S3 API的,并可以作为一个独立的存储后端或与其他流行的开源解决方案(如Kubernetes)集成。 MinIO 允许你存储非结构化数据(如图…

人工智能基础导论

人工智能基础导论 绪论 人工智能的主要流派符号主义(逻辑主义) 连接主义(仿生学派) 行为主义(控制论)符号主义:数理逻辑→逻辑演绎系统→启发式算法→专家系统→知识工程理论与技术(主流)缺点:符号主义的核心是知识表示,那么对于像感知、形象思维、模式识别等问题,…

搭建 npm 私服

背景 准备搭建一个自己的网站,放些平时练手的 demo,如果是不同项目,想要保持风格一致,或是要用到一些工具方法,就要在每个项目复制一份,不是很好维护,于是就想要搭建一个自己的 npm 私服 安装 verdaccio 1 安装 verdaccio,这是一个开源的私有 npm 注册中心,要注意的是…

C# WPF PrintDialog 打印(2)

前面https://www.cnblogs.com/yinyu5/p/18633910使用PrintVisual方法只打印了可见部分的元素,所以这里改为使用PrintDocument方法来进行打印。 需要引用System.Printing.dll 界面代码:1 <Window x:Class="WpfApp123.MainWindow"2 xmlns="http://sc…

Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载

Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——Another Redis Desktop Manager,并提供…

RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel

https://zhuanlan.zhihu.com/p/4185359719本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章! “VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~” 01 VScode调试MMU开启之前的kernel 有了调试OpenSBI的基础,再调试kernel,那设置相当简…

中考阅读理解深入逻辑分析-006 A Streams Journey to the Sea 一条小溪通往大海的旅程

文章正文 A little stream ran down from a high mountain far, far away through many villages and forests, until it reached a desert. The stream then thought,“I’ve been through countless difficulties. I should have no problem crossing the desert!”But as sh…

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 自学教材《C语言程序设计》…

Chrome 或引入 Gemini AI 功能「Glic」,需访问麦克风;理想同学 App 即将上线支持语音交流、识物

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

洛谷题单指南-线段树的进阶用法-P3834 【模板】可持久化线段树 2

原题链接:https://www.luogu.com.cn/problem/P3834 题意解读:静态区间第k小问题,可持久化线段树(也称为主席树)模版题。 解题思路: 一、朴素想法:如何求完整区间[1,n]第k小 1、权值线段树 设n个数构成序列a,b数组代表a中元素出现的次数,即b数组的构建方式为对每一个a[…