2009-11-05 87 views
4

我从来没有使用C#打印任何东西。我只是想知道标准的做法是什么。在我的表单中,我有几个列表框和几个文本框。我想打印他们的内容,并在打印预览中显示它们,并在桌面上布置漂亮的布局。然后从他们我希望用户能够打印。打印C#中控件的内容?

在此先感谢!

回答

2

您将需要使用System.Drawing.Printing库。您将使用PrintDocument.Print方法,您可以在MSDN Page with Example上找到

+0

这种方法非常完美,因为我已经将用户信息保存到文本文件。谢谢! – 2009-11-05 21:24:35

+0

当我按照您提供的MSDN链接收到“找不到内容”错误时。 – Matt 2013-05-05 06:20:42

4

这是关于在C#中进行基本打印的nice little tutorial。它处理文本,但可以很容易地扩展绘制其他任何东西。

在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; 
} 
+0

应该明确处理'pen rectPen',还是GC处理? – jp2code 2011-04-28 13:47:18

+1

GC不处理该问题。但这也不是一个很好的例子。代码示例中的三个绘画对象Font,Pen和Brush是我实际上在类作用域声明的内容,而不是每次调用PrintPage处理函数时重新创建它们。我建议你在你的其他代码中做同样的事情。如果我记得你使用了围绕笔和笔刷的陈述。这是矫枉过正,让代码更难阅读。只需将这些对象移动到类范围并让它们存在于应用程序的整个生命周期中即可。 – 2011-04-28 14:06:47

+0

我喜欢你提供的链接[可爱的小教程](http://www.codeproject.com/Articles/9282/Simplified-NET-Printing-in-C)。谢谢,相当好用! – Matt 2013-05-05 06:24:14