C# Win Forms: PDFs, Reports, DataGrid und Charting

WiZdooM

Erfahrenes Mitglied
Hallo,

Wie ich im .NET-Café bereits gepostet habe, schreibe ich momentan für eine Behörde ein Tool zur Auswertung von Callstatistiken.
Dafür gibt es zwei Elemente im Programm: Eine Chart und ein DataGridView. Die Algorithmen berechnen alles wunderbar und die Daten werden auch sauber in Chart und DataGridView in der Applikation angezeigt. Jetzt ist die Problematik diese beiden Informationen präsentabel auf eine DinA4 Seite zu bekommen. Offensichtlich ist seitens MS für Halblaien nativ nicht direkt vorgesehen Grafiken und Tabellen direkt aus WindowsForms zu Exportieren oder zu Drucken, was ich als Defizit empfinde.

Ich habe bisher das iTextSharp zum Export als PDF genutzt. Soweit sieht das auch nicht schlecht aus. Ich habe die Chart als BMP und die Daten des DataGridView an eine PdfPTable übergeben. Das Problem an der Tabelle ist, dass sie mit jeder Kalenderwoche wächst und am Ende des Jahres 6 Zeilen und max. 54 Spalten hat. Die müssen natürlich auf eine A4-Seite gehen. Die Frage ist nur: wie? Ich habe etwas experimentiert und festgestellt, dass er zwar die Spalten zusammenschiebt, aber die Leserlichkeit dabei verloren geht. Das ist natürlich nicht akzeptabel, wofür ich eine Lösung brauche.

Nun habe ich überlegt, zur Laufzeit einen Bericht zu erstellen, dort meine Elemente zu platzieren und zu füllen, und diesen anschließend meiner PDF-Exportfunktion zu übergeben. Die Frage ist nur wie ich das bewerkstellige, da ich mit Berichten noch nie was zu tun hatte. Es kam des öfteren bereits das Schlagwort "Crystal Reports" auf. Doch ich habe mir sagen lassen, dass zur Ausfürung des Programms die komplette Crystal-Schnittstelle auf dem jeweiligen Rechner installiert sein muss. Da ich das Tool für eine Behörde entwickle, sollte nach Möglichkeit das Tool ohne große externe Komponenten auskommen, da ich nicht sagen kann auf welchem Rechner am Ende mein Tool ausgeführt wird.
Nun wird die Luft langsam dünn und ich dachte an den Default Report von Visual Studio 2010, aber erste Experimente haben nur in Ratlosigkeit geendet:
- Welche Assemblys brauche ich?
- Wie erzeuge ich den Report zur Laufzeit?
- Kann ich den Report überhaupt zur Laufzeit so erstellen, dass ich ihn dem iTextSharp (oder einer anderen Schnittstelle zu PDF) direkt übergeben kann?
- Wie weise ich auf dem Report überhaupt darzustellende Elemente zu?
- Wie bringe ich die Daten, die erst zur Laufzeit vorliegen in den Bericht bzw in die Elemente?
- Wie kann ich mir den Report anzeigen lassen um einfach Modifikationen durchführen zu können?

Ein anderer Ansatz war (wie bereits angesprochen und im .NET-Café gepostet) über die Druckschnittstelle zu gehen, nur dafür müsste ich die Zellen für die Daten der DataGridView per Hand zeichnen lassen, nur sage ich ganz ehrlich dass mir die Mechanik dahinter noch etwas zu hoch ist. Ein Snapshot des Controls kommt dahingehend nicht in Frage, da ich für die Spalten des DataGridView im AutoSizeColumnMode DisplayedCells und nicht Fill benutze (Lesbarkeit bei bis zu 54 Spalten, da auch die Bildschirmauflösung in der Behörde nicht unbegrenzt hoch ist und bei durchschnittlich 1024x768 liegt.).

Vielleicht ist mein Ansatz auch total falsch, das ganze in eine einzige starre Applikation zu stecken. Aber die Anforderung ist eben ein DAU-Tool, bei dem man einfach nur ein oder zwei mal klickt und seinen weekly Report simple und einfach bekommt. Ein fertiges Reporting-Tool ist einfach zu komplex und das ganze mit Excel zu machen... naja ich halte von dem VBA bzw der "IDE" überhaupt nichts und es kann praktisch jeder in dem Code rumfummeln. Ich habe bisher nur hobbymässig mit WinForms rumgespielt und ansonsten nur immer mal kleine Verwaltungstools auf Konsolenebene programmiert und habe jetzt mein erstes "wichtiges" Entwicklungsprojekt, kann aber gleichzeitig nicht mit allzugroßem Programmierknow-how glänzen, deshalb seid nachsichtig mit mir :)

Über ein paar Tips und Tricks, ggf. Links zu anderen Beitrgen wäre ich äußerst Dankbar.

Grüße
Wiz
 

Spyke

Premium-User
Wenn ich das richtig verstanden habe sollen Grid und Chart auf ein A4 gedruckt werden.

Da wäre nun einerseits die Möglichkeit über das PrintDocument von MS dies selbst zu zeichnen.

Oder was ich als einfacher empfinde würde von ComponentOne das C1PrintDocument zu verwenden.
Ist allerdings kostenpflichtig.
 

WiZdooM

Erfahrenes Mitglied
Hallo Spyke,

Danke für die Antwort.
Das mit dem Zeichnen ist mir schon in den Sinn gekommen, aber halt ein Heidenaufwand. Einfacher wäre da eine andere Print-Assembly zu nehmen. Meine Intention war eben Kosteneinsparung, weswegen ich das von Haus aus oder mit freien Assemblies machen kann.
Evtl lässt sich die Druckfunktion aus dem Programm noch rauskürzen, man kann ja mit jedem PDF-Viewer die PDF ausdrucken. Ist eine Frage der Argumentation gegenüber dem Kunden, zumal die Skalierung der DataGridView für PDF nun recht gut geklappt hat und eigentlich kein nativer Druck mehr notwendig ist. Eine andere Idee die mir grade kommt ist, dem PrintDocument einfach mal versuchen das PDFDocument zu übergeben...

Ich schließ dann mal das Thema und bedanke mich.

Grüße