Datagridview drucken - Vorüberlegungen und allgemeine Fragen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Datagridview drucken - Vorüberlegungen und allgemeine Fragen

    Holladiho
    ich beschäftige mich gerade mit dem Problem ein DGV zu drucken.
    Hierzu habe ich eine Frage.
    Ich finde es deutlich leichter eine pdf zu erzeugen (mithilfe von pdfFileWriter), als mit dem .net integriertem Zeug, etwas druckbares zu erzeugen.

    Daher meine Frage. Ist es möglich dem PrintPreviewDialog eine pdf zu übergeben, damit diese dort angezeigt (und eben gedruckt) werden kann?
    Die Überlegung ist dann, eine pdf mit Inhalt des DGV zu erstellen, diese im PrintPreview Dialog anzuzeigen und anschließend wieder zu löschen.

    DerSmurf schrieb:

    Daher meine Frage. Ist es möglich dem PrintPreviewDialog eine pdf zu übergeben, damit diese dort angezeigt (und eben gedruckt) werden kann?
    Ich glaub nicht.
    Wenn ich recht erinnere muss bei einer PrintPreview in ein Graphics-Objekt gezeichnet werden.
    Ich wüsste nicht, dasses einen Befehl Graphics.DrawPdf() gäbe.

    DerSmurf schrieb:

    Ist es möglich dem PrintPreviewDialog eine pdf zu übergeben
    Definitiv nein.
    Der PrintPreviewDialog zeigt genau das an, was im angebundenen PrintCocument im PrintPage-Event gedruckt wird.
    Wie das funktioniert, habich hier verzapft:
    Drucken mehrseitiger Dokumente
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Schade.
    Ich hatte die Hoffnung um das erstellen einer Tabelle zum ausdrucken drumherum zu kommen :(
    In eine pdf habe ich das schon mal gemacht.

    @RodFromGermany
    dein Tutorial habe ich bereits durchgearbeitet.
    Mein Problem ist aber nicht der PrintPreview Dialog oder ähnliches, sondern das zeichnen der Tabelle mit Inhalt auf dem Blatt.
    Es handelt sich um ein codegeneriertes DGV, mit einer unbekannten Anzahl an Spalten.
    Diese soll gescheid aussehend gedruckt werden.
    Da habe ich nun auf Codeprojekt eine Klasse gefunden, die ich anpassen muss, aber die tut was ich möchte.
    Entsprechend DGV eine Tabelle zentriert auf dem Blatt erstellen, in dem alle Spalten gleich breit sind.
    Sieht halt nur noch doof aus, wenn der Zelleninhalt zu groß ist, dann sieht mans nicht.

    @VB1963
    dein Tut habe ich überflogen. Das sieht Mega spannend aus.
    Ich frage mich nur, ob es für meine Zwecke geeignet ist. Oder obs dafür nicht too much ist.
    Mein Ziel ist es wirklich nur ein einziges DGV zu drucken.

    Falls jemand bereit ist, mir bei dem - scheinbar ja echt nicht trivialen - Problem zu helfen, bastel ich mal eine DemoSolution und lad sie hoch.
    Ich wunder mich, dass es mit einem PdfWriter leichter sein soll - das täte mich wirklich interessieren.
    Vielleicht machst du ja nur DGV.CopyFromScreen() oder sowas, und tust die Bitmap dann ins Pdf.
    Also eine Bitmap kann man auch Painten, mit Graphics.DrawImage().
    Da wird aber nur so viel vom DGV gedruckt, wie grad zu sehen ist - einen korrekten Tabellen-Ausdruck stellt man sich normalerweise bischen anners vor.

    Und dann wirds schon konzeptionell kompliziert:
    Was soll passieren, wenn die Tabelle breiter ist als eine Din A4-Seite?
    Soll dann der abgeschnittene Teil auf die nächste Seite?
    Das wird aber gemein, es richtig auszurechnen, welcher Teil abgeschnitten ist, gemerkt werden muss für die nächste Seite, bevor dann die übernächste Seite wieder dran ist mit den neuen Zeilen darunter.
    Auch die Frage ist, was mit Zell-Inhalten ist, die grösser sind als die Zelle.
    Im DGV werden die ja abgeschnitten, und per Tooltip kann man denn doch nachlesen, was drinne-steht.
    Beim Drucken musste dich entscheiden: Abschneiden, oder mache ich die gedruckte Zelle so breit bis passt?
    Und wenn dann einer seine Autobiografie in der Zelle niedergelegt hat, dann wird die gedruckte Tabelle eben 120 A4-Blätter breit - na, viel Spass.

    Jo - find ich interessant, dass sich solche Probleme mittm pdfWriter leicht lösen lassen.
    Ich persönlich exportiere zu druckende Daten eher nach Excel.
    Und dann soll der User zusehen, wie er in Excel da einen annehmbaren Ausdruck erstellt - Excel ist da ja ziemlich möchtig.
    Ich resigniere vor dir :)
    Mit dem pdfFileWriter GLAUBE ICH, ist es leichter :o)
    Allerdings würden mich oben genannte Probleme dort wahrscheinlich genauso zum verzweifeln bringen, wie sie es gerade bei der Druckvorschau tun.
    Ich habe es bisher geschafft, die Spalten alle gleich groß zentriert auf einem Blatt anzuzeigen.
    Gleich groß ist in meinem Fall - wegen der Abschneiderei - sinnfrei.
    Ich werde mal schauen, wie es aussieht, wenn ich die prozentuale Größe der DGV Spalten errechne und die Tabellenspalten dann in der gleichen prozentualen Größe anzeige.
    Das mit der Bitmap könnte evtl. auch nicht so schlecht sein, denn das zu druckende DGV wird ja zumindest auf dem Bildschirm gescheit dargestellt. (Es geht um die Statistikauswertungsform, bei der du mir mit dem langsamen Code geholfen hast - falls du dich dran erinnerst)
    Von Bitmap habe ich abstand genommen, weil diese Methode in den Youtube Videos zu diesem Thema sehr verbreitet ist.
    Und bei allen (wirklich allen die ich gesehen habe) Videos habe selbst ich gemerkt, dass es sich um schlechten Code handelt.

    Und wenn ich Sonntag etwas bessere Laune (und damit mehr Lust) habe, setze ich mich mal intensiv mit @VB1963 Tutorial auseinander.
    Das ist ja kein Thema für mal zwischendurch, ohne viel Lust.
    Vielleicht hilft es mir ja doch.

    Wenn das alles nix wird, lasse ich den Druck sein, oder exportiere es tasöchlich in Excel.
    Wobei ich eigentlich auf Fremdanwendungen verzichten wollte.
    Soho.
    Ich habe meine runtergeladene Demo jetzt ein wenig verändert. Bin fast soweit, dass es gut aussieht.
    Ich habe mal die DemoSolution hochgeladen, denn ich finde nicht die Stelle an der "angefangen" wird zu schreiben.
    Also ich hätte den Header gerne etwas höher, und auch den Beginn der gedruckten Tabelle etwas höher.
    Vorab: Das Option Strict Off der Klasse PrintTheDGV werde ich natürlich noch entfernen, aber es war nötig, ums überhaupt ans laufen zu bekommen.
    Ich wollte nicht die ganzen Typkonvertierungen durchführen, weil ich nicht wusste, ob ich damit überhaupt was tun kann.

    Allen Code in Regions könnte ihr ignorieren. Dieser dient nur dazu, das DGV zu füllen.
    Einfach auf den Button drucken drücken und in der sich öffnenden Form die letzten beiden Checkboxen (ohne Namen) enthaken.
    So solls aussehen (die Form werde ich optional machen, so kann ich die PrintKlasse auch an anderer Stelle nutzen (wo dann evtl. die Spaltenauswahl Sinn macht))

    Edit: Alternativ habe ich auch eine Bitmap basierte Lösung.
    Das sieht im konkreten Beispiel hier sehr gut aus. Aber kommt natürlich schnell an seine Grenzen, wenn die Anzahl der Spalten steigt oder sinkt.
    Dafür ist der Code echt überschaubar (wenn auch nicht auf andere DGVs anwendbar)
    Aber zumindenst eine kleine Anzahl an Spalten, könnte man egalisieren, wenn die Bitmap horizontal zentriert dargestellt wird.
    Das wäre meine zweite Frage :o)

    VB.NET-Quellcode

    1. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNPrint.Click
    2. '************************CREATE A BITMAP AND DRAW THE DATAGRID VIEW ON IT **********************************
    3. bitmap = New Bitmap(Me.DGVEvaluation.Width, Me.DGVEvaluation.Height)
    4. 'DGVEvaluation.DrawToBitmap(bitmap, New Rectangle(0, 0, Me.DGVEvaluation.Width, Me.DGVEvaluation.Height))
    5. Dim DGVwidth As Double
    6. Dim DGVColAmount = DGVEvaluation.Columns.Count
    7. For i = 0 To DGVColAmount
    8. If i = DGVColAmount - 2 Then Exit For
    9. DGVwidth += DGVEvaluation.Columns(i).Width
    10. Next
    11. DGVwidth += 2
    12. DGVEvaluation.DrawToBitmap(bitmap, New Rectangle(0, 0, CInt(DGVwidth), Me.DGVEvaluation.Height))
    13. '********************* show the print preview ***********************************************************
    14. PrintPreviewDialog1.Document = PrintDocument1
    15. PrintPreviewDialog1.Document.DefaultPageSettings.Landscape = True
    16. PrintPreviewDialog1.ShowDialog()
    17. End Sub
    18. Private Sub PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    19. '********************************************* PRINT THE CONTENTS ************************************************************
    20. e.Graphics.DrawImage(bitmap, 10, 30)
    21. End Sub
    Dateien
    • DGVPrintText.zip

      (106,57 kB, 78 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DerSmurf“ ()

    @DerSmurf Beim nächsten Hochladen einer Solution soltest Du sie zunächst bereinigen, damit die obj, bin und vs-Verzeichnise nicht den VBP-Server zumüllen.
    ===
    Die Kopfzeile der Tabelle ist etwas zu schmal geraten, sieht aber ansonsten sehr gut aus. :thumbup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    DerSmurf schrieb:

    Bitte verzeih
    Ausnahmsweise.
    Die Höhe ist noch zu klein:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kannst du mir denn sagen, wie ich es hinbekomme, dass die Tabelle höher und weiter links beginnt?
    Wenn ich die Ränder um die Tabelle verkleinere, bekomme ich ja automatisch mehr Text hinein, weil die Tabelle ja größer wird.
    Aber ich finde die Stelle nicht, an der die Position für die Tabelle festgelegt wird.
    @DerSmurf Da musst Du den Druck-Rahmen entsprechend anpassen:
    Drucken mehrseitiger Dokumente
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!