Drucken mit zwei Schleifen funzt net richtig

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von AbsolutCF.

    Drucken mit zwei Schleifen funzt net richtig

    Hi,

    ich habe folgendes Problem.

    Ich habe Daten in zwei TXT Dateien die beim Drucken zu einer Liste zusammengeführt werden.
    Die Daten und Linien zu drucken funtioniert. Jetzt wollte ich aber das wenn er 34 Zeilen gedruckt hat auf die zweite Seite wechselt und da weiterdruckt.


    In der mainloaderliste stehen sozusagen die Titel aller Daten drin, .count ist also die Gesamtzahl aller daten
    Es sind zum Testen 39 items drin.

    VB.NET-Quellcode

    1. Private Sub PD1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PD1.PrintPage
    2. Static pageNum As Integer = 1
    3. Dim pagecount As Integer = (mainLoader.Items.Count - 1) / 34
    4. If ((mainLoader.Items.Count - 1) / 34) - pagecount > 0 Then
    5. pagecount += 1
    6. End If
    7. Dim anfang As Integer = 1
    8. Static ende As Integer
    9. Dim printedRows As Integer = 0
    10. 'enden definieren
    11. If (mainLoader.Items.Count - 1) <= 34 Then
    12. ende = mainLoader.Items.Count - 1
    13. Else
    14. ende = 34
    15. End If
    16. For a = pageNum To pagecount
    17. For i = anfang To ende
    18. 'hier würde jetzt der Druckcode kommen. Hab ich aber weggelassen zur besseren Übersicht
    19. Next
    20. If pagecount > 1 Then
    21. anfang = ende + 1
    22. printedRows = ende
    23. ende += (mainLoader.Items.Count - 1) - printedRows
    24. Else
    25. Exit Sub
    26. End If
    27. Next
    28. 'Seitenzahl prüfen
    29. pageNum += 1
    30. If pageNum <= pagecount Then
    31. e.HasMorePages = True
    32. Else
    33. e.HasMorePages = False
    34. pageNum = 1
    35. Exit Sub
    36. End If
    37. End Sub


    Das Problem ist, so wioe ich es in mit Einzelschritten verfolgen konnte, er schreibt brav von zuerst von zeile 1-34 auf seite 1. Dann schreibt er zeile 35-38 ( 38 ist der letzte Eintrag) wieder auf die erste seite unten dran und dann wechselt er zur zweiten seiten und schreibt wieder zeile 1-34.

    Ich versteh einfach nicht wo der fehler ist.
    Vieleicht hab ich das zu kompliziert erklärt. :D

    Also ich hab eine Liste mit momentan 39 Einträgen. Auf jede Seite sollen max. 34 Zeilen gedruckt werden und dann soll die seite gewechselt werden.


    VB.NET-Quellcode

    1. For i = 1 to Liste.items.count -1
    2. ' Druckcode
    3. next

    So sieht der code start vereinfacht aus, druckt aber alles nur auf eine seite.

    Jetzt will ich das er bis zeile 34 geht da einen seitenumbruch erzwingt und dann auf seite 2 wechselt und dort von Zeile 35 bis ende druckt und wenn später nötig auch noch eine dritte oder vierte seite druckt, da die tabelle stetig wachsen wird.
    Und ich bleibe dennoch bei meiner Aussage :D

    Nochmal zum mitschreiben:

    0 mod 34 = 0
    1 mod 34 = 1
    2 mod 34 = 2
    .
    .
    .
    33 mod 34 = 33
    34 mod 34 =0
    35 mod 34 =1

    Sobald dein absolut_Zeilenzähler mal wieder Null ist erhöhst du deinen Seitenzähler.
    Dein aktueller_Zeilenzähler ist das Ergebnis aus der Mod-Function. Geht also immer von
    0 bis 33. Das sind 34 Zeilen pro Seite. Das wolltest du doch.

    Mit der DIV-Function (Backslash \ ) kannst du direkt ausrechnen auf welcher Seite dein absoluter Zeilenzähler
    grade angekommen ist.

    0 \ 34 =0
    1 \ 34 =0
    2 \ 34 =0
    .
    .
    .
    34 \ 34 = 1
    35 \ 34 = 1
    .
    .
    .
    68 \ 34 = 2

    Was brauchst du mehr?
    das mit dem Mod raff ich ja aber wie bring ich das in die Schleife ein so das er wenn 0 ist auch die Seite wechselt und dann auf der nächsten Seite mit Zeile 35 weiter druckt und dann am ende auch aufhört? Komme mit dem e.hasmorepages irgendwie nicht ganz klar. :S

    Kannst du mir ein grobes Code Beispiel posten, wäre echt super. :)
    Also zur Zeit habe ich Urlaub, da kann ich nicht auf alle meine Projekte zugreifen.

    Aber: Hast du dich schon mit der PrintDocument Komponente beschäftigt?
    Es gibt es auch eine PrintPreview Komponente. Da zeichnet man halt alles
    rein, was auf die Druckseite soll. Und kann es schon am Bildschirm betrachten.

    Zu Bedenken ist auch, dass wenn du mit verchiedenen Schriftgrößen arbeitest,
    dann wird die Zeilenanzahl auch unterschiedlich. Dazu gibt es dann noch die
    MeasureStringMethode. Damit kannst du berechnen wann die Seite voll ist.

    Die nächste Seite drucken ist noch ein bischen kniffelig, weil man die gleiche
    Druckroutine nochmal aufruft. Dazu muss aber vorher noch ein Flag gesetzt
    werden. HasMorePages...

    Hier ein ganzes Beispiel zusammen zu setzen ist mir jetzt allerdings etwas
    zu viel Arbeit.
    ok kann ich verstehen. ;) Mir würd schon reichen wenn du mir sagen könntest wo ich e.hasmorepages korrekt hinsetzten muss bei der Schleife.

    vor oder nach dem Next oder ist das egal da er eh die ganze druckroutine durchläuft?
    Super!! Ich such seit 2 Wochen nach einer Lösung :P aber meinst du ich wäre einmal über diese Seite gestolpert? Heb gerade mal meinen Code etwas nach dem Link angepasst und es fuktioniert!! Sind zwar noch ein paar Schönheitsfehler da aber die sind mit ein paar Änderungen in der Druckroutine erledigt.

    Vielen vielen Dank das Du so viel Geduld mit mir gehabt hast! :thumbsup: :thumbsup: :thumbsup:

    Ich wünsch Dir auf jeden Fall noch einen schönen Urlaub und Danke nochmal!!!!!!!! :thumbsup: :thumbsup: :thumbsup: :thumbsup: :thumbsup: