タイトル | : PrintPreviewDialogの印刷ボタン |
記事No | : 8467 |
投稿日 | : 2008/12/16(Tue) 10:58 |
投稿者 | : ひでと |
お世話になります。 表と文字を交互に印刷する必要があり、改ページをあまり意識せずに印刷処理をすることは できないかと、模索しています。 PrintWithChangePageと名づけたプロジェクトにDataGridView,Textと名づけた2つのクラスを作り そのクラスで(印刷したかどうか)を記録しておこうと考えました。
PrintPreviewの表示までは出来たのですが、PrintPreviewの印刷ボタン?を押すと、 PrintDocument1_PrintPageが直接呼び出されてしまうため、 (印刷した) と記録されたものが印刷されず、結果として最後のページだけが 印刷されてしまいます。 PrintPreviewの印刷ボタン?から下記のDocument1_Document(初期化の処理?)を一度 呼び出す方法があれば解決しそうなのですが、アドバイスをお願いします。
処理の呼び出しは以下のように行っています。 Dim DataGridViewPrints As List(Of PrintWithChangePage.DataGridView) Dim TextPrints As List(Of PrintWithChangePage.Text) Dim DataGridViewPrint As PrintWithChangePage.DataGridView Dim TextPrint As PrintWithChangePage.Text Private Sub Document1_Document() DataGridViewPrints = New List(Of PrintWithChangePage.DataGridView) TextPrints = New List(Of PrintWithChangePage.Text) TextPrint = New PrintWithChangePage.Text TextPrint.Text = "test" TextPrints.Add(TextPrint)
DataGridViewPrint = New PrintWithChangePage.DataGridView DataGridViewPrint.DGV = Me.dgv1'DataGridViewです DataGridViewPrints.Add(DataGridViewPrint)
TextPrint = New PrintWithChangePage.Text TextPrint.Text = "test2" TextPrints.Add(TextPrint)
TextPrint = New PrintWithChangePage.Text TextPrint.Text = "test3" TextPrints.Add(TextPrint) End Sub Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim BeginY As Single TextPrints(0).Print(0, BeginY, e) DataGridViewPrints(0).Print(BeginY, e) TextPrints(1).Print(0, BeginY, e) TextPrints(2).Print(0, BeginY, e) e.HasMorePages = False End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Me.PrintPreviewDialog1.Document = Me.PrintDocument1 Document1_Document() Me.PrintPreviewDialog1.ShowDialog() End Sub
DataGridViewクラスの一部は 以下のようにしています。 Imports System.Windows Imports System.Drawing Public Class DataGridView Public PrnSet As New Printing.PrinterSettings Public PapSet As New Printing.PageSettings Public nFont As Font = New Font("MS 明朝", 9) Public nBrush As Brush = Brushes.Black Public DGV As Forms.DataGridView
Dim pLeft, pTop, pWidth, pHeight As Single Dim BeginRow As Integer Dim IsPrinted As Boolean
Public Sub Print(ByRef BeginY As Single, ByRef e As System.Drawing.Printing.PrintPageEventArgs) If e.HasMorePages = True Then Exit Sub If IsPrinted = True Then Exit Sub With e.PageSettings pLeft = .Margins.Left pTop = .Margins.Top pWidth = .PaperSize.Width - .Margins.Left - .Margins.Right - PapSet.HardMarginX * 2 pHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom - PapSet.HardMarginY * 2 End With Dim i As Integer Dim Last As Integer Last = PageLastRow(e) PrintTittle(BeginY, e) For i = BeginRow To Last PrintRecord(BeginY, i, e) Next BeginRow = i If BeginRow >= DGV.Rows.Count - 1 Then IsPrinted = True e.HasMorePages = False BeginRow = 0 Else IsPrinted = False e.HasMorePages = True End If End Sub
Textクラスの一部は以下のようです。 Imports System.Drawing Public Class Text Public PrnSet As New Printing.PrinterSettings Public PapSet As New Printing.PageSettings Public nFont As Font = New Font("MS 明朝", 9) Public nBrush As Brush = Brushes.Black Public Text As String Dim pLeft, pTop, pWidth, pHeight As Single Dim IsPrinted As Boolean Public Sub Print(ByVal BeginX As Single, ByRef BeginY As Single, ByRef e As System.Drawing.Printing.PrintPageEventArgs) If e.HasMorePages = True Then Exit Sub If IsPrinted = True Then Exit Sub With e.PageSettings pLeft = .Margins.Left pTop = .Margins.Top pWidth = .PaperSize.Width - .Margins.Left - .Margins.Right - PapSet.HardMarginX * 2 pHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom - PapSet.HardMarginY * 2 End With IsPrinted = True e.Graphics.DrawString(Text, nFont, nBrush, pLeft + BeginX, pTop + BeginY) BeginY = BeginY + e.Graphics.MeasureString(Text, nFont).Height End Sub
|