2016-11-29 3 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 только получать вызывается один раз, и что вы используете, что один вызов для печати все. Это не так, как работает.

Когда нужно распечатать новую страницу, она снова вызовет метод PrintPage, поэтому переменная цикла должна находиться вне области печати. Когда печатается следующая страница, вам нужно знать, какой номер строки вы в настоящее время печатаете.

Попробуйте так:

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 

Установите переменную Printline к нулю перед печатью, или установите его равным нулю в случае BeginPrint.

Смежные вопросы