【问题标题】:How to multipage duplex print with multiple Windows Forms in Visual Basic?如何在 Visual Basic 中使用多个 Windows 窗体进行多页双面打印?
【发布时间】: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


【解决方案1】:

对于那些对答案感兴趣的人:它是 e.HasMorePages = True.. 但唯一缺少的是(公共)“PageNumber”计数器,它可以在案例之间进行选择。 e.HasMorePages 到达 Sub 的末尾很重要。否则不会有效果。请参阅下面的代码。

Public Class Inhoudsopgave
Dim PageNumber As Integer = 0
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

    PrintDocument1.DefaultPageSettings.Margins = New Printing.Margins(0, 0, 0, 0)
    PrintDocument1.DefaultPageSettings.Landscape = True
    PrintDialog1.Document = PrintDocument1 'PrintDialog associate with PrintDocument.
    If PrintDialog1.ShowDialog() = DialogResult.OK Then
        PrintDocument1.Print()
    End If
End Sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

    PrintDocument1.DefaultPageSettings.Margins = New Printing.Margins(0, 0, 0, 0)

    Select Case PageNumber
        Case 0
            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
                e.HasMorePages = True
            Next
        Case 1
            'aow
            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


            'Doe dit voor iedere Groupbox en Chart
            Dim BMPGroupbox1 As Bitmap = New Bitmap(AOW.GroupBox1.Width, AOW.GroupBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
            Dim BMPGroupbox2 As Bitmap = New Bitmap(AOW.GroupBox2.Width, AOW.GroupBox2.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
            Dim BMPGroupbox3 As Bitmap = New Bitmap(AOW.GroupBox3.Width, AOW.GroupBox3.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
            Dim BMPChart1 As Bitmap = New Bitmap(AOW.Chart1.Width, AOW.Chart1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)

            'Doe dit voor iedere Groupbox en Chart
            AOW.GroupBox1.DrawToBitmap(BMPGroupbox1, New Rectangle(0, 0, AOW.GroupBox1.Width, AOW.GroupBox1.Height))
            AOW.GroupBox2.DrawToBitmap(BMPGroupbox2, New Rectangle(0, 0, AOW.GroupBox2.Width, AOW.GroupBox2.Height))
            AOW.GroupBox3.DrawToBitmap(BMPGroupbox3, New Rectangle(0, 0, AOW.GroupBox3.Width, AOW.GroupBox3.Height))
            AOW.Chart1.DrawToBitmap(BMPChart1, New Rectangle(0, 0, AOW.Chart1.Width, AOW.Chart1.Height))

            'Doe dit voor iedere Groupbox en Chart
            e.Graphics.DrawImage(BMPGroupbox1, AOW.GroupBox1.Left, AOW.GroupBox1.Top, AOW.GroupBox1.Width, AOW.GroupBox1.Height)
            e.Graphics.DrawImage(BMPGroupbox2, AOW.GroupBox2.Left, AOW.GroupBox2.Top, AOW.GroupBox2.Width, AOW.GroupBox2.Height)
            e.Graphics.DrawImage(BMPGroupbox3, AOW.GroupBox3.Left, AOW.GroupBox3.Top, AOW.GroupBox3.Width, AOW.GroupBox3.Height)
            e.Graphics.DrawImage(BMPChart1, AOW.Chart1.Left, AOW.Chart1.Top, AOW.Chart1.Width, AOW.Chart1.Height)

            'Alle TextBoxes met witte achtergrond
            For Each TextBox In {AOW.Koptextbox, AOW.TextBox99, AOW.TextBox19, AOW.TextBox21, AOW.TextBox11, AOW.TextBox12, AOW.TextBox14, AOW.TextBox13, AOW.TextBox17, AOW.TextBox15, AOW.TextBox16, AOW.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 {AOW.Koptextbox, AOW.TextBox99, AOW.TextBox19, AOW.TextBox21, AOW.TextBox13, AOW.TextBox17, AOW.TextBox18, AOW.TextBox16}
                e.Graphics.FillRectangle(Brushes.LightYellow, TextBox.Left, TextBox.Top, TextBox.Width, TextBox.Height)
            Next

            'Textboxes Centered
            For Each TextBox In {AOW.Koptextbox, AOW.TextBox99, AOW.TextBox21, AOW.TextBox19, AOW.TextBox14, AOW.TextBox13, AOW.TextBox17, AOW.TextBox15, AOW.TextBox16, AOW.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 {AOW.TextBox1, AOW.TextBox2, AOW.TextBox3, AOW.TextBox4, AOW.TextBox5, AOW.TextBox6, AOW.TextBox7, AOW.TextBox8, AOW.TextBox9, AOW.TextBox10, AOW.TextBox11, AOW.TextBox24, AOW.TextBox23, AOW.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 {AOW.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 AOW.Controls
                If c.GetType Is GetType(Label) Then
                    e.Graphics.DrawString(c.Text, c.Font, Brushes.Black, c.Left, c.Top)
                End If
            Next

            e.HasMorePages = False
    End Select

    PageNumber += 1
End Sub
End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多