2016-11-29 35 views
2

リストボックスに項目のリストを印刷しようとしています。私は284項目あります。約四分の一が印刷され、残りは印刷されず、最後に最後の入力が途中で終了します。 e.HasMorePagesを利用して次のページに印刷を中断した箇所を追跡することについてオンラインで読んでいますが、現在は何も印刷されておらず、印刷ページ1,2,3,4,5などが記載されています。何も起こらない。私はCtrl + Cを押してプログラムを閉じる必要があります。どのようにして目的のプリントアウトを達成できますか?PrintDocumentとHasMorePagesを使用して複数のページを印刷する

Private Sub Print_Click(sender As Object, e As EventArgs) Handles Print.Click 
    Dim PrintDialog1 As New PrintDialog 
    Dim result As DialogResult = PrintDialog1.ShowDialog() 
    If result = DialogResult.OK Then PrintDocument1.Print() 

    ' PrintPreviewDialog1.Document = PrintDocument1 
    ' PrintPreviewDialog1.ShowDialog() 
End Sub 

Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage 
    ' e.HasMorePages = True 
    Dim itemCount As Integer 
    Dim startX As Integer = 10 
    Dim startY As Integer = 10 
    Dim n As Integer 
    For x As Integer = 0 To SoftwareLBox.Items.Count - 1 
    e.Graphics.DrawString(SoftwareLBox.Items(x).ToString, SoftwareLBox.Font, Brushes.Black, startX, startY) 
    startY += SoftwareLBox.ItemHeight 
    If n = 150 Then 
     e.HasMorePages = True 
     n = 0 
     startY = 10 
    End If 
    startY += e.PageBounds.Height 
    n += 1 
    Next 
End Sub 

答えて

3

あなたのコードを書いた方法は、あなたがPrintPageメソッドが一度だけ呼ばれる、とあなたはすべてを印刷するには、1つの呼び出しを使用していることばかりだと思う私に語りました。それはそれが動作する方法ではありません。

新しいページを印刷する必要がある場合は、再度PrintPageメソッドを呼び出します。そのため、ループ変数はPrintPageスコープ外になければなりません。次のページが印刷されるときに、現在印刷中の行番号を知る必要があります。あなたは、印刷、またはBeginPrintイベントでそれをゼロに設定する前にゼロにプリントライン変数を設定

Private printLine As Integer = 0 

Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) 
    Dim startX As Integer = e.MarginBounds.Left 
    Dim startY As Integer = e.MarginBounds.Top 
    Do While printLine < SoftwareLBox.Items.Count 
    If startY + SoftwareLBox.ItemHeight > e.MarginBounds.Bottom Then 
     e.HasMorePages = True 
     Exit Do 
    End If 
    e.Graphics.DrawString(SoftwareLBox.Items(printLine).ToString, SoftwareLBox.Font, _ 
          Brushes.Black, startX, startY) 
    startY += SoftwareLBox.ItemHeight 
    printLine += 1 
    Loop 
End Sub 

はこのようにそれを試してみてください。

関連する問題