在C#中打印控件的内容?

6

我从未使用C#打印过任何内容。我只是想知道标准的方法是什么。在我的表单中,我有一些列表框和一些文本框。我想打印它们的内容并在打印预览中显示它们,以表格的形式呈现良好的布局。然后我希望用户能够打印。

提前感谢!

3个回答

5
以下是关于在C#中进行基本打印的简单易懂的教程。它处理文本,但可以轻松扩展以绘制任何其他内容。
在C#中进行打印与在C#中进行自定义绘画非常相似,唯一的区别是坐标系从屏幕表示翻转,并且必须考虑页面跨度(在必要时)。打印方式也有点反直觉,因为您必须启动打印过程,然后处理页面打印事件。
下面是一个简单的示例,假设存在名为listBox1的列表框控件,其中包含一些项目的打印事件处理程序。它会绘制每个项目以及周围的框。
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    Font font = new Font("Arial", 10f);
    Graphics g = e.Graphics;
    Pen rectPen = new Pen(Color.Black, 2f);
    Brush brush = Brushes.Black;

    // find widest width of items
    for (int i=0; i<listBox1.Items.Count; i++)
        if(maxItemWidth < (int)g.MeasureString(listBox1.Items[i].ToString(), font).Width)
            maxItemWidth = (int)g.MeasureString(listBox1.Items[i].ToString(), font).Width;

    // starting positions:
    int itemHeight = (int)g.MeasureString("TEST", font).Height + 5;
    int maxItemWidth = 0;
    int xpos = 200;
    int ypos = 200;

    // print
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
        g.DrawRectangle(rectPen, xpos, ypos, maxItemWidth, itemHeight );
        g.DrawString(listBox1.Items[i].ToString(), font, brush, xpos, ypos);

        ypos += itemHeight;
    }

    e.HasMorePages = false;
}

Pen rectPen 应该显式地被处理掉,还是由 GC 处理? - user153923
1
垃圾回收器无法处理这个。但这也不是一个很好的例子。在这个代码示例中,Font、Pen和Brush这三个绘图对象,我实际上会在类范围内声明它们,而不是每次调用PrintPage处理程序时重新创建它们。我建议您在其他代码中也这样做。如果我记得正确,您在一些Pens和Brushes周围包装了using语句。那太过了,让代码更难读。只需将这些对象移动到类范围并让它们存在于应用程序的生命周期中即可。 - Paul Sasik
我喜欢你提供的链接中的“不错的小教程”。谢谢,非常容易使用! - Matt

2

2
您需要使用System.Drawing.Printing库。您将使用PrintDocument.Print方法,您可以在MSDN页面示例中找到该方法。

这个方法非常完美,因为我已经让用户将信息保存到文本文件中了。谢谢! - Bob Dylan
当我访问你提供的MSDN链接时,出现了“内容未找到”的错误。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接