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日

相关文章

  • C#中@的用法总结

    下面我就来详细讲解 “C#中@的用法总结” 的攻略。 正文 1. @符号的含义 在C#中,@符号是一个特殊的字符,它具有特定的含义。在C#中,@符号表示一个字符串中的所有特殊字符都不需要进行转义。 在普通的字符串中,有些特殊字符需要进行转义,如\n代表换行符,\”代表双引号,\’代表单引号等。如果要在字符串中使用这些特殊字符,我们需要使用转义字符来表示这些特…

    C# 2023年6月6日
    00
  • C#实现简易计算器功能(1)(窗体应用)

    下面是“C#实现简易计算器功能(1)(窗体应用)”的完整攻略,包含两个实例说明。 标题 C#实现简易计算器功能(1)(窗体应用) 简介 本文将介绍如何使用C#语言实现简易计算器功能。在这个教程中,我们将学习如何创建一个窗体应用程序,并使用C#语言来实现基本的计算器功能。 步骤 步骤1. 创建新项目 首先,打开Visual Studio,并点击“创建新项目”选…

    C# 2023年6月6日
    00
  • asp.net 生成随机密码的具体代码

    生成随机密码是一个常见的需求,特别是在ASP.NET的网站开发中更是经常用到。本文将详细讲解ASP.NET生成随机密码的具体代码。 一. 生成指定位数的随机密码 要生成指定位数的随机密码,可以使用Random类从字符集中随机抽取指定数量的字符来进行组合。这里给出的代码生成一个8位长度的随机密码: public static string GenerateRa…

    C# 2023年5月31日
    00
  • MVC使用极验验证制作登录验证码学习笔记7

    下面是“MVC使用极验验证制作登录验证码学习笔记7”的完整攻略。 1. 简介 本文将以MVC模式为基础,介绍如何使用极验验证制作登录验证码。 2. 准备工作 在开始使用极验验证之前,需要先注册一个极验账号,并创建一个验证实例。具体步骤如下: 进入极验验证官方网站,点击“注册”按钮,填写相关信息,完成注册流程; 登录账号后,进入“验证管理”页面,创建一个验证实…

    C# 2023年5月31日
    00
  • C#实现简易画图板的示例代码

    下面我将为您详细讲解“C#实现简易画图板的示例代码”的完整攻略。 1. 分析需求 在我们开始编写代码之前,首先需要分析我们的需求,明确我们需要实现什么功能。在这个例子中,我们需要实现一个简易的画图板,其中主要涵盖以下功能: 绘制直线、矩形、圆形等基本图形 选择画笔颜色和大小 橡皮擦功能 保存绘图结果 2. 准备工作 在开始编写代码之前,我们需要先完成一些准备…

    C# 2023年5月31日
    00
  • C#中的尾递归与Continuation详解

    C#中的尾递归与Continuation详解 什么是尾递归? 在递归调用中,当一个函数调用自己时,称为递归调用。如果这个递归函数中最后一步就是调用自身,并且这个调用的返回值直接作为当前的函数返回值,那么这个递归就是尾递归。例如下面这个基于斐波那契数列的递归函数: int Fibonacci(int n) { if(n == 0) return 0; if(n…

    C# 2023年6月7日
    00
  • C# 代码大小写规范说明

    下面是关于C#代码大小写规范的详细讲解: 标识符命名规范 在C#编程中,标识符通常指变量名、函数名、类名、命名空间等,其命名要符合一定的规范。具体规范如下: 标识符只能由字母、数字和下划线组成,第一个字符必须是字母或下划线; 标识符不能是C#中的关键字和保留字,如if、else、while、int、bool等; 标识符应该能够反映其所代表的含义,且不能太长;…

    C# 2023年5月15日
    00
  • 轻松学习C#的属性

    当您学习C#编程语言时,属性是一个重要的概念。属性可用于对类中的字段进行访问、设置和检查。通过使用属性,可以更好地组织代码并提高代码重用性。 什么是属性? 属性是一种C#编程语言中的特殊语法,它允许使用getter和setter方法对类中的字段进行访问、设置和检查。通过属性,可以在类外部访问私有字段,其本质上是对字段进行封装,确保对数据的访问是安全和可控的。…

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