【发布时间】:2016-04-04 13:13:35
【问题描述】:
我正在尝试找到一种将多个 Windows 窗体打印为报告的方法。我有多种表格来计算我们客户的退休福利,我正在尝试打印这些表格,以便我们的客户得到施舍。此时,我在每个表单上都有一个 PrintDocument 组件,我可以在单独的页面上将每个表单打印为不同的文档,但我想要实现的是在 1 个 PrintDocument 文档中双面打印所有这些表单带有 1 个 PrintButton。单击另一个表单。
所以给你举个例子。我有 2 个 Windows 窗体(窗体 AOW 和窗体 Basisinfo),每个窗体都有一个 PrintDocument 组件。我已经按照 PrintDocument1_PrintPage 子中正确位置的方式绘制了文本、图像、图表等。我想在名为 CloseReport 的第三个表单中打印表单 AOW 和 Basisinfo。
我已经拥有的代码不能让我进行双面打印:
基本信息:
Public Class Basisinfo
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles ButtonPrinten.Click
For teller = 1 To 30
If inhoudlijst(teller, 0) = "" Then
inhoudlijst(teller, 0) = "Basisinfo"
inhoudlijst(teller, 1) = "True"
PrintDocument1.DefaultPageSettings.Landscape = True
PrintDocument1.DefaultPageSettings.PrinterSettings.Duplex = Printing.Duplex.Default
printarray3(teller) = PrintDocument1
Exit For
End If
Next
End Sub
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim stringFormatCenter As New StringFormat()
stringFormatCenter.Alignment = StringAlignment.Center
stringFormatCenter.LineAlignment = StringAlignment.Center
Dim stringFormatFar As New StringFormat()
stringFormatFar.Alignment = StringAlignment.Far
stringFormatFar.LineAlignment = StringAlignment.Center
Dim stringFormatNear As New StringFormat()
stringFormatNear.Alignment = StringAlignment.Near
stringFormatNear.LineAlignment = StringAlignment.Center
'Alle TextBoxes met witte achtergrond
For Each TextBox In {TextBox17, TextBox18, TextBox35, TextBox1, TextBox29, TextBox2, TextBox3, TextBox4, TextBox12, TextBox13, TextBox10, TextBox9, TextBox26, TextBox8, TextBox7, TextBox16, TextBox21, TextBox14, TextBox28, TextBox27, TextBox6, TextBox23, TextBox19, TextBox31, TextBox24, TextBox25, TextBox30, TextBox15, TextBox34, TextBox22, TextBox20, TextBox33, TextBox32}
e.Graphics.DrawRectangle(Pens.Black, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height))
e.Graphics.FillRectangle(Brushes.White, TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height)
Next
'Alle TextbBoxes met gele achtergrond
For Each TextBox In {TextBox17, TextBox18, TextBox35, TextBox1, TextBox29}
e.Graphics.FillRectangle(Brushes.LightYellow, TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height)
Next
'Textboxes Centered
For Each TextBox In {TextBox17, TextBox18, TextBox35, TextBox1, TextBox29}
e.Graphics.DrawString(TextBox.Text, TextBox.Font, Brushes.Blue, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height), stringFormatCenter)
Next
'Textboxes Near
For Each TextBox In {TextBox2, TextBox3, TextBox4, TextBox12, TextBox13, TextBox10, TextBox9, TextBox26, TextBox8, TextBox7, TextBox16, TextBox21, TextBox14, TextBox28, TextBox27, TextBox6, TextBox23, TextBox19, TextBox31, TextBox24, TextBox25, TextBox30, TextBox15, TextBox34, TextBox22, TextBox20, TextBox33, TextBox32}
e.Graphics.DrawString(TextBox.Text, TextBox.Font, Brushes.Blue, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width + 20, TextBox.Height), stringFormatNear)
Next
'Textboxes Far
For Each TextBox In {}
e.Graphics.DrawString(TextBox.Text, TextBox.Font, Brushes.Blue, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height), stringFormatFar)
Next
For Each c As Control In Me.Controls
If c.GetType Is GetType(Label) Then
e.Graphics.DrawString(c.Text, c.Font, Brushes.Black, c.Left, c.Top)
End If
Next
End Sub
AOW:
Public Class AOW
Sub ButtonPrinten_Click(sender As Object, e As EventArgs) Handles ButtonPrinten.Click
For teller = 1 To 30
If inhoudlijst(teller, 0) = "" Then
inhoudlijst(teller, 0) = "AOW"
inhoudlijst(teller, 1) = "True"
PrintDocument1.DefaultPageSettings.Landscape = True
PrintDocument1.DefaultPageSettings.PrinterSettings.Duplex = Printing.Duplex.Default
printarray3(teller) = PrintDocument1
'printvlag_basisinfo = True
Exit For
End If
Next
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim stringFormatCenter As New StringFormat()
stringFormatCenter.Alignment = StringAlignment.Center
stringFormatCenter.LineAlignment = StringAlignment.Center
Dim stringFormatFar As New StringFormat()
stringFormatFar.Alignment = StringAlignment.Far
stringFormatFar.LineAlignment = StringAlignment.Center
Dim stringFormatNear As New StringFormat()
stringFormatNear.Alignment = StringAlignment.Near
stringFormatNear.LineAlignment = StringAlignment.Center
'Alle TextBoxes met witte achtergrond
For Each TextBox In {Koptextbox, TextBox99, TextBox19, TextBox21, TextBox11, TextBox12, TextBox14, TextBox13, TextBox17, TextBox15, TextBox16, TextBox18}
e.Graphics.DrawRectangle(Pens.Black, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height))
e.Graphics.FillRectangle(Brushes.White, TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height)
Next
'Alle TextbBoxes met gele achtergrond
For Each TextBox In {Koptextbox, TextBox99, TextBox19, TextBox21, TextBox13, TextBox17, TextBox18, TextBox16}
e.Graphics.FillRectangle(Brushes.LightYellow, TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height)
Next
'Textboxes Centered
For Each TextBox In {Koptextbox, TextBox99, TextBox21, TextBox19, TextBox14, TextBox13, TextBox17, TextBox15, TextBox16, TextBox18}
e.Graphics.DrawString(TextBox.Text, TextBox.Font, Brushes.Blue, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height), stringFormatCenter)
Next
'Textboxes Near
For Each TextBox In {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8, TextBox9, TextBox10, TextBox11, TextBox24, TextBox23, TextBox22}
e.Graphics.DrawString(TextBox.Text, TextBox.Font, Brushes.Blue, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width + 20, TextBox.Height), stringFormatNear)
Next
'Textboxes Far
For Each TextBox In {TextBox12}
e.Graphics.DrawString(TextBox.Text, TextBox.Font, Brushes.Blue, New Rectangle(TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height), stringFormatFar)
Next
For Each c As Control In Me.Controls
If c.GetType Is GetType(Label) Then
e.Graphics.DrawString(c.Text, c.Font, Brushes.Black, c.Left, c.Top)
End If
Next
End Sub
End Class
关闭报告:
Public Class CloseReport
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
PrintDocument1.DefaultPageSettings.Landscape = True
PrintDialog1.Document = PrintDocument1
If PrintDialog1.ShowDialog() = DialogResult.OK Then
For teller = 1 To 30
If IsNothing(printarray3(teller)) = False Then
printen6(printarray3(teller))
End If
Next teller
End If
End Sub
End Class
如果你想知道 printen6 函数的作用:
PrintDocument.PrinterSettings.DefaultPageSettings.PrinterResolution.Kind = Printing.PrinterResolutionKind.High
PrintDocument.PrinterSettings.DefaultPageSettings.Landscape = True
PrintDocument.PrinterSettings.DefaultPageSettings.Margins = New Printing.Margins(0, 0, 0, 0)
PrintDocument.DefaultPageSettings.PrinterSettings.Duplex = Printing.Duplex.Default
PrintDocument.Print()
我正在考虑如何合并 PrintDocument 文件以便可以进行双面打印,或者考虑如何使用 HasMorePages 创建多个页面。我在网上读过很多关于 HasMorePages 的文章,但那只提供了加载文本文件的代码..
我希望你能帮助我,因为我真的被困在这个问题上。提前致谢!
【问题讨论】:
-
有人能帮帮我吗?我正在寻找一种无需阅读文本文件即可进行双面打印的方法。而不是文本文件阅读器,我需要打印表单上的控件。每个表单都有足够的控件放置在正确的位置以完全填满页面。控件是图表和组框的位图,也可以是文本框和标签。
-
仍然没有找到解决我的问题的方法。谁能帮帮我?
标签: vb.net forms printing printdocument