如何在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都可调用:
- 在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
- 修改Form2的PrintPage事件处理方法,调用该公共方法:
Public Sub PrintDocument1_PrintPage_1(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage PrintPanelContent(e) End Sub
- 在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
相关产品推荐
相关产品推荐

