tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルPrintPreviewDialogの印刷ボタン
記事No8467
投稿日: 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

[ツリー表示へ]
タイトルRe: PrintPreviewDialogの印刷ボタン
記事No8468
投稿日: 2008/12/16(Tue) 11:31
投稿者ひでと
>     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

すいません
         e.HasMorePages = False
は間違って挿入していました。これがあるとプレビューも1ページだけに
なってしまいます。

[ツリー表示へ]
タイトル自己レスです
記事No8471
投稿日: 2008/12/17(Wed) 10:42
投稿者ひでと
お世話になります。
> PrintPreviewの印刷ボタン?から下記のDocument1_Document(初期化の処理?)を一度
> 呼び出す方法があれば解決しそうなのですが、アドバイスをお願いします。

PrintPreviewDialogを継承したクラスを作ってみました。 
Public Class PrintPreviewDialog
    Inherits System.Windows.Forms.PrintPreviewDialog
End Class
ここで 新たに PrintPreviewDialogの「印刷」? ボタンのクリックイベントに
Document1_Documentの呼び出しを記載したいのですが、
それらしいイベントが見つかりません。
また そのイベントにどのように記載していいのかも ?です。
アドバイスを お願いいたします。

[ツリー表示へ]
タイトル再び自己レスです申し訳ありません
記事No8472
投稿日: 2008/12/17(Wed) 13:55
投稿者ひでと
お世話になります。
>> PrintPreviewの印刷ボタン?から下記のDocument1_Document(初期化の処理?)を一度
> 呼び出す方法があれば解決しそうなのですが、アドバイスをお願いします。 

BeginPrintのイベント内で処理するだけでよかったのですね。
理解していませんでした。
PrintPreviewDialogの印刷ボタンを押すと BeginPrintのイベントが先に発生し、
そのあとPrintPageのイベントが発生するということなのだと思います。
申し訳ありませんでした。

[ツリー表示へ]