You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Form1中触发Form2的PrintPage事件?

问题描述

我当前处于Form1窗体中,希望触发Form2内的PrintPage事件。

Form2中目标事件处理代码:

Public Sub PrintDocument1_PrintPage_1(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim dm As New Bitmap(Me.Panel1.Width, Me.Panel1.Height)
    Panel1.DrawToBitmap(dm, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height))
    e.Graphics.DrawImage(dm, 0, 0)

    Dim aPS As New PageSetupDialog
    aPS.Document = PrintDocument1
End Sub

我希望在Form1的printall方法指定位置触发该事件,printall方法代码:

Public Sub printall()
    If txtempname.Items.Count = 0 Then
        MessageBox.Show("There is no Record to Print")
    Else
        For i = 0 To txtempname.Items.Count - 1
            txtempname.SelectedIndex = i
            getEmployeeInfo()
            getattendance()
            getDeductions()
            getExtraDeductions()
            getLoans()
            calculate()
            printallnote()
            PrintPayslip.payslip()

            ' 需要在这里触发PrintPage事件

            PrintPayslip.print()
            PrintPayslip.Close()
        Next
    End If
End Sub
解决方案

方法1:通过调用PrintDocument的Print()触发事件

如果PrintPayslip是Form2的实例,可直接调用其内部PrintDocument1的Print()方法触发PrintPage事件。若不想弹出默认打印对话框,可设置PrintController为StandardPrintController:

Public Sub printall()
    If txtempname.Items.Count = 0 Then
        MessageBox.Show("There is no Record to Print")
    Else
        For i = 0 To txtempname.Items.Count - 1
            txtempname.SelectedIndex = i
            getEmployeeInfo()
            getattendance()
            getDeductions()
            getExtraDeductions()
            getLoans()
            calculate()
            printallnote()
            PrintPayslip.payslip()

            ' 触发PrintPage事件
            PrintPayslip.PrintDocument1.PrintController = New Printing.StandardPrintController()
            PrintPayslip.PrintDocument1.Print()

            PrintPayslip.print()
            PrintPayslip.Close()
        Next
    End If
End Sub

方法2:将打印逻辑封装为独立公共方法(更推荐)

直接触发事件处理方法并非最佳实践,建议把打印逻辑抽成公共方法,让事件处理方法和Form1都可调用:

  1. 在Form2中添加公共方法:
Public Sub PrintPanelContent(e As Printing.PrintPageEventArgs)
    Dim dm As New Bitmap(Me.Panel1.Width, Me.Panel1.Height)
    Panel1.DrawToBitmap(dm, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height))
    e.Graphics.DrawImage(dm, 0, 0)

    Dim aPS As New PageSetupDialog
    aPS.Document = PrintDocument1
End Sub
  1. 修改Form2的PrintPage事件处理方法,调用该公共方法:
Public Sub PrintDocument1_PrintPage_1(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    PrintPanelContent(e)
End Sub
  1. 在Form1中手动调用该方法(需构建正确的PrintPageEventArgs实例):
' 在printall方法的指定位置
Dim args As New Printing.PrintPageEventArgs(
    PrintPayslip.PrintDocument1.DefaultPageSettings,
    New Printing.Margins(10,10,10,10),
    New RectangleF(0,0, PrintPayslip.PrintDocument1.DefaultPageSettings.PrintableArea.Width, PrintPayslip.PrintDocument1.DefaultPageSettings.PrintableArea.Height),
    New Rectangle(0,0, PrintPayslip.Panel1.Width, PrintPayslip.Panel1.Height)
)
PrintPayslip.PrintPanelContent(args)

此方法更符合面向对象设计,避免直接依赖事件处理方法,代码可维护性更强。

内容的提问来源于stack exchange,提问作者Karl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 07:18:19