winfrom 打印表格 字符串的封装实现代码 附源码下载

下面是关于“winform打印表格字符串的封装实现代码附源码下载”的完整攻略:

一、背景介绍

在实际开发中,我们经常会遇到需要打印表格字符串的需求,例如打印报表、流水账单等等。在C#的winforms框架中,可以通过调用PrintDocument类的Print方法来实现打印功能。然而,PrintDocument类并没有提供直接打印表格字符串的方法,因此需要我们自己进行封装。下面,我们将介绍如何封装实现打印表格字符串的功能。

二、封装实现代码

下面我们将分步骤介绍如何封装实现打印表格字符串的功能。

1. 创建PrintDocument对象

首先,需要创建PrintDocument对象,并为其设置PrintPage事件处理程序。PrintPage事件在打印时发生,可以用于处理每一页的打印内容。示例代码如下:

PrintDocument printDocument = new PrintDocument();
printDocument.PrintPage += new PrintPageEventHandler(PrintPageHandler);

2. 实现PrintPage事件处理程序

其次,需要实现PrintPage事件处理程序来处理每一页的打印内容。在该事件处理程序中,我们将绘制表格字符串的内容,并调用Graphics.DrawString方法进行绘制。示例代码如下:

private void PrintPageHandler(object sender, PrintPageEventArgs e)
{
    // 设置打印区域
    Rectangle pageBounds = e.MarginBounds;

    // 绘制表格字符串内容
    string tableString = "姓名\t性别\t年龄\n张三\t男\t20\n李四\t女\t18\n王五\t男\t22";
    using (var tableFont = new Font("宋体", 12))
    {
        e.Graphics.DrawString(tableString, tableFont, Brushes.Black, pageBounds);
    }
}

在上面的示例中,我们使用了一个字符串变量tableString来存储表格字符串的内容,并使用\t表示各个列之间的分隔符。在绘制表格字符串内容时,我们使用了Graphics.DrawString方法,并传入tableFont、Brushes.Black和pageBounds参数来实现绘制。

3. 对话框中调用Print方法

最后,我们将创建好的PrintDocument对象传入打印对话框,并在对话框中调用Print方法来打印内容。示例代码如下:

// 创建打印对话框
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument;

// 显示打印对话框
if (printDialog.ShowDialog() == DialogResult.OK)
{
    // 开始打印
    printDocument.Print();
}

在上面的示例中,我们创建了一个打印对话框并将PrintDocument对象传入其中。当用户点击打印按钮时,程序将调用Print方法来打印内容。

三、示例

下面,我们将给出两个示例,分别演示如何在winforms框架中打印简单表格和复杂表格。

1. 打印简单表格

private void PrintSimpleTable()
{
    PrintDocument printDocument = new PrintDocument();
    printDocument.PrintPage += new PrintPageEventHandler(PrintPageHandler);

    void PrintPageHandler(object sender, PrintPageEventArgs e)
    {
        Rectangle pageBounds = e.MarginBounds;
        string tableString = "姓名\t性别\t年龄\n张三\t男\t20\n李四\t女\t18\n王五\t男\t22";
        using (var tableFont = new Font("宋体", 12))
        {
            e.Graphics.DrawString(tableString, tableFont, Brushes.Black, pageBounds);
        }
    }

    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDocument;

    if (printDialog.ShowDialog() == DialogResult.OK)
    {
        printDocument.Print();
    }
}

在上面的示例中,我们定义了一个名为PrintSimpleTable的方法。在这个方法中,我们创建了PrintDocument对象,实现了PrintPage事件处理程序,并添加了打印对话框。在PrintPage事件处理程序中,我们绘制了一个简单的表格字符串,并在打印对话框中调用Print方法来打印内容。

2. 打印复杂表格

private void PrintComplexTable()
{
    PrintDocument printDocument = new PrintDocument();
    printDocument.PrintPage += new PrintPageEventHandler(PrintPageHandler);

    void PrintPageHandler(object sender, PrintPageEventArgs e)
    {
        Rectangle pageBounds = e.MarginBounds;

        // 表格内容
        string tableString = "编号\t姓名\t性别\t年龄\t地址\n";
        tableString += "001\t张三\t男\t20\t北京市海淀区\n";
        tableString += "002\t李四\t女\t18\t北京市朝阳区\n";
        tableString += "003\t王五\t男\t22\t北京市通州区\n";
        tableString += "004\t赵六\t女\t19\t北京市丰台区\n";
        tableString += "005\t钱七\t女\t25\t北京市昌平区\n";

        // 计算表格列宽
        int[] columnWidths = new int[5];
        string[] rows = tableString.Split('\n');
        for (int i = 0; i < rows.Length; i++)
        {
            string[] columns = rows[i].Split('\t');
            for (int j = 0; j < columns.Length; j++)
            {
                columnWidths[j] = Math.Max(columnWidths[j], columns[j].Length);
            }
        }

        // 绘制表格
        using (var tableFont = new Font("宋体", 12))
        using (var headerBrush = new SolidBrush(Color.DarkGray))
        {
            int x = pageBounds.Left;
            int y = pageBounds.Top;
            for (int i = 0; i < rows.Length; i++)
            {
                string[] columns = rows[i].Split('\t');
                for (int j = 0; j < columns.Length; j++)
                {
                    int columnWidth = columnWidths[j] * tableFont.Height;
                    Rectangle cellBounds = new Rectangle(x, y, columnWidth, tableFont.Height);
                    e.Graphics.DrawString(columns[j], tableFont, i == 0 ? headerBrush : Brushes.Black, cellBounds);
                    x += columnWidth;
                }
                y += tableFont.Height;
                x = pageBounds.Left;
            }
        }
    }

    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDocument;

    if (printDialog.ShowDialog() == DialogResult.OK)
    {
        printDocument.Print();
    }
}

在上面的示例中,我们定义了一个名为PrintComplexTable的方法。在这个方法中,我们创建了PrintDocument对象,并实现了PrintPage事件处理程序。在PrintPage事件处理程序中,我们首先定义了一个表格字符串,其中包含编号、姓名、性别、年龄和地址等五个列。然后,我们计算了每一列的宽度,并使用Graphics.DrawString方法绘制表格。同时,我们也对第一行进行了特殊处理,使用灰色作为表头的背景颜色。最后,在打印对话框中调用Print方法来打印内容。

四、源码下载

如果需要完整的源码,可以前往Github下载:https://github.com/changsin/Winforms-Table-Printer

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:winfrom 打印表格 字符串的封装实现代码 附源码下载 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • asp.net生成静态页并分页+ubb第2/2页

    下面是“asp.net生成静态页并分页+ubb第2/2页”的完整攻略。 什么是asp.net生成静态页并分页+ubb第2/2页 “asp.net生成静态页并分页+ubb第2/2页”是一种能够将动态网页生成静态网页,并进行分页显示的技术。同时,它还支持使用ubb标签进行排版和格式化。这种技术使得网站能够更快地加载和访问,提升用户的体验。 实现步骤 本攻略中将通…

    C# 2023年5月31日
    00
  • C#实现目录跳转(TreeView和SplitContainer)的示例代码

    下面是详细讲解“C#实现目录跳转(TreeView和SplitContainer)的示例代码”的完整攻略。 1.示例说明 在实现目录跳转的过程中,我们需要使用到TreeView控件和SplitContainer控件。其中TreeView控件用于显示文件夹和文件结构,SplitContainer控件用于分割窗体,将TreeView控件和文件内容的显示区域分开,…

    C# 2023年6月6日
    00
  • 深入解析.NET 许可证编译器 (Lc.exe) 的原理与源代码剖析

    深入解析.NET 许可证编译器 (Lc.exe) 的原理与源代码剖析 简介 .NET 许可证编译器 (Lc.exe) 是 Microsoft .NET Framework 中的一个工具,用来创建和管理 .NET 应用程序的许可证。Lc.exe 工具可以将某个特定的 Assembly 添加到另一个 Assembly 中,从而使其需要一个许可证才能运行。在运行某…

    C# 2023年5月31日
    00
  • 在ASP.NET 2.0中操作数据之六:编程设置ObjectDataSource的参数值

    操作数据是Web应用程序中最常见的任务之一。在ASP.NET 2.0之后,为了简化设置数据源和处理数据的任务,可以使用ObjectDataSource控件。本攻略将详细讲解如何编程设置ObjectDataSource的参数值。 什么是ObjectDataSource ObjectDataSource是ASP.NET用于极度简化数据访问代码的控件之一。利用Ob…

    C# 2023年5月31日
    00
  • C#编程实现带有Aero效果的窗体示例

    C#编程实现带有Aero效果的窗体示例 介绍 Aero是Windows Vista中引进的一个用户界面特性,主要是增强用户界面的可观性和交互性,如透明度、窗口预览、任务栏缩略图等。在C#编程中,我们可以通过代码实现带有Aero效果的窗体,提高程序的用户体验。 本文将详细说明如何通过C#编程实现带有Aero效果的窗体,包含两条示例说明。 实现步骤 步骤1:安装…

    C# 2023年5月31日
    00
  • C#之Socket(套接字)通信

    下面是关于“C#之Socket(套接字)通信”的完整攻略。 一、Socket(套接字)通信简介 Socket(套接字)是网络编程中的一个概念,主要用于实现网络通信。在Socket通信中,可以使用多种协议进行通信,如TCP、UDP等。 在C#中,Socket通信主要是通过System.Net命名空间中的一些类和接口实现的。 二、Socket(套接字)通信流程 …

    C# 2023年5月31日
    00
  • WPF+ASP.NET SignalR实现后台通知功能的示例代码

    搭建WPF+ASP.NET SignalR环境 首先需要配置好WPF和ASP.NET SignalR的环境。 WPF可以使用Visual Studio自带的WPF应用程序模板创建,而ASP.NET SignalR则需要在Visual Studio中额外进行安装和配置。安装方法可以参考官方文档,也可以在NuGet中搜索 Microsoft.AspNet.Sig…

    C# 2023年5月31日
    00
  • ASP.NET Core实现文件上传和下载

    ASP.NET Core 实现文件上传和下载 在 ASP.NET Core 中,可以使用多种方式实现文件上传和下载。本攻略将详细介绍如何在 ASP.NET Core 中实现文件上传和下载,并提供多种上传方式的示例。 步骤一:编写文件上传代码 在 ASP.NET Core 中,可以使用 IFormFile 接口实现文件上传。以下是一个简单的文件上传示例: [H…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部