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

yizhihongxing

下面是关于“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日

相关文章

  • C# 动态编译、动态执行、动态调试

    C#是一种现代化的、面向对象的编程语言。它具有强大的基础类库、易于学习的语法和高效的代码执行效率,与其它主流编程语言相比备受程序员的推崇。 动态编译、动态执行和动态调试是C#语言中的重要特性,允许我们通过程序代码动态生成或执行其他代码,并提供针对生成的代码的调试功能。下面详细介绍这三个特性的攻略: C# 动态编译 C#动态编译是指在运行时通过C#代码编译器生…

    C# 2023年5月31日
    00
  • C#基于TCP实现简单游戏客户端的完整实例

    下面我将为你详细讲解基于TCP实现简单游戏客户端的完整攻略。 一、前置准备 在开始实现前需要做以下几个准备工作: 安装并配置好C#程序开发环境,比如Visual Studio等。 确认游戏协议,即确定游戏客户端和服务器之间的通信方式和数据格式,一般采用二进制流。 确认游戏场景和角色设定,确定游戏客户端和服务器需要交互的数据类型和具体实现方式。 熟悉Socke…

    C# 2023年6月7日
    00
  • C#创建安全的栈(Stack)存储结构

    下面是关于C#创建安全的栈(Stack)存储结构的完整攻略: 1. Stack的概念 Stack是一种线性的数据结构,可以通过’栈顶’进行插入、删除和访问元素。栈的特殊性在于它是LIFO(后进先出)模型,就像一叠盘子,最后放上去的盘子将会最先被取走。 2. C#的Stack类 在C#中,Stack类封装了栈的逻辑,可以使用其提供的方法来创建、push(添加)…

    C# 2023年5月15日
    00
  • 适用与firefox ASP.NET无刷新二级联动下拉列表

    下面是“适用于 Firefox ASP.NET 无刷新二级联动下拉列表”的完整攻略。 介绍 在ASP.NET网站开发过程中,常常需要实现下拉列表的二级联动,即根据第一个下拉选项的选择,动态加载第二个下拉选项的内容。而且为了用户体验,需要使用无刷新技术,即在不刷新整个页面的情况下,实现二级下拉列表的动态更新。 本文将介绍如何实现这个功能,并针对火狐(Firef…

    C# 2023年5月31日
    00
  • C#构建树形结构数据(全部构建,查找构建)

    C#构建树形结构数据(全部构建,查找构建) 前言 树形结构数据在实际开发中非常常见,具有分级、层级、分类等特点,通常应用于目录结构、组织机构、商品分类等场景。本文将介绍如何使用C#构建树形结构数据,包括全部构建和查找构建两种方案。 全部构建 步骤一:定义数据结构 我们假设有一个数据表,包含id、parentId、name三个字段,其中id为自增主键,pare…

    C# 2023年5月31日
    00
  • C#编程自学之运算符和表达式

    C#编程自学之运算符和表达式 运算符 C#中的运算符是用来对值进行计算、比较或连接等操作的符号。常用的运算符包括算术运算符、关系运算符、逻辑运算符和赋值运算符等。 算术运算符 算术运算符包括加、减、乘、除、取余数和取负数等。其中加减乘除符号分别为“+”、“-”、“*”、“/”,取余符号为“%”,取负符号为“-”。 // 加减乘除示例 int a = 3; i…

    C# 2023年6月6日
    00
  • asp.net 字符串、二进制、编码数组转换函数

    asp.net提供了多个字符串、二进制、编码数组的转换函数,它们可以帮助我们在不同的数据类型之间进行转换。下面是一些常用的转换函数: Convert.ToBase64String Method 该方法可以将给定的二进制数据转换成base64编码的字符串: byte[] data = new byte[] { 0x48, 0x65, 0x6c, 0x6c, 0…

    C# 2023年5月31日
    00
  • ASP.NET常用代码

    下面我会详细讲解 ASP.NET 常用代码的攻略,包含两条示例。 1. 常用的 ASP.NET 代码 1.1 控件操作 在 ASP.NET 中,我们可以通过控件来操作网页中的元素,如文本框、按钮等等。以下是一些常见的控件操作代码: 在代码中获取控件: TextBox txtBox = (TextBox)FindControl("txtName&qu…

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