DataGrid drucken

DeeFour

Mitglied
Hallo,

ich bin ziemlich neu was C# Programmierung angeht. Ich habe ein kleines Tool programmiert, daß Daten von einer Webseite in Form von XML ausliest und in einem Datagrid anzeigt.

Jetzt möchte ich gerne diese Daten auch ausdrucken können. Kann mir jemand sagen wie das geht?

Ich habe zwar schon hinbekommen das Grid auszudrucken, aber leider wird immer nur der auf dem Bildschirm sichtbare Teil ausgedruckt.

Code:
private void pictureBox2_Click(object sender, System.EventArgs e) // Print Button
{
  PrintDocument pd = new PrintDocument();
  pd.PrintPage += new PrintPageEventHandler (this.pd_PrintPage);
  pd.Print();
}

private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
PaintEventArgs myPaintArgs = new PaintEventArgs(e.Graphics, new Rectangle(new Point(0, 0), this.Size));
this.InvokePaint(dataGrid1, myPaintArgs);
}

Das ist der Sourcecode den ich bisher fürs drucken genommen habe.
 
Der geringste Aufwand ist es, wenn du aus deinen Daten im DataGrid einen Crystal Reports-Bericht generierst. Diesen kannst du dann ganz einfach ausdrucken.

Die zweite Variante ist, dass du selbst alle Informationen zum Drucker schickst, also alles komplett selber zusammenbaust.
 
das mit dem Crystal Report habe ich gestern versucht bin aber kläglich gescheitert.

Ich bekomme mein DataSet irgendwie nicht an den Crystal Report gebunden. Wenn ich ne rpt Datei mache, dann sehe ich wenigstens was im Report aber die rpt kann ich nicht mit meinen Daten verbinden, da es die ja zu diesem Zeitpunkt noch nicht gibt. Die lade ich erst auch Knopfdruck von einer Webseite, in Form von XML, aus dem Internet.

Ich hab hier in der Firma mindestens 6 Leute rumlaufen, die alle C# programmieren, aber mit kann da keiner helfen, die sagen alle daß sie nur Webapplikationen programmieren können.

Man das ist echt frustrierend.
 
Sollte doch so funktionieren:

Du erstellst einen Report und speicherst ihn ab. Danach folgendes:
Code:
ReportDocument rpt = new ReportDocument(); // Neues Report-Document erstellen
rpt.Load(@"C:\MyReport.rpt"); // vorhandenen Report laden
rpt.Database.Tables[0].SetDataSource(ds_xml); // DataSet setzen
crystalReportViewer1.ReportSource = rpt; // dem ReportViewer den Report zuweisen

Sollte dir weiterhelfen.
 
ich habe den Code an mein Programm angepaßt, bekomme aber folgenden Fehler "Fehler in Datei C:\.......\CrystalReport1.rpt: ungültige Tabellennummer"

hier mein Code:
Code:
ReportDocument rpt = new ReportDocument(); // Neues Report-Document erstellen
rpt.Load(@"c:\m2_win\m2_windows\CrystalReport1.rpt"); // vorhandenen Report laden
rpt.Database.Tables[0].SetDataSource(dataSet1); // DataSet setzen
crystalReportViewer1.ReportSource = rpt; // dem ReportViewer den Report zuweisen
 
Das Problem ist vermutlich, dass in einem DataSet mehrer Tables vorhanden sein können. Du müsstest, statt dessen die entsprechende DataTable aus dem Dataset zuweisen.
 
ich habe auch versucht an der Stelle wo ich das Dataset angebe, auch direkt die Tabelle anzugeben. Also "(dataSet1.Tables["karten"])". Aber das hat auch nicht geklappt.

Vielleicht hab ich ja beim Report was falsch gemacht. Ich hab nur einen leere Report erstellt zum testen. Oder muß ich im Report selber noch was für das DataSet vorbereiten?
 
also wenn ich den Source auf der Seite die du gepostet hast richtig verstehe, werden die Daten aus dem Dataset geladen und daraus wird dann erst die rpt on the fly erstellt.

Ich habe dazu folgenden Code benutzt:

Code:
byte[] data= new byte[0];
DataRow myRow;
myRow=dataSet1.Tables[0].Rows[0];

data =  (byte[])myRow[0];
int ArraySize = new int();
ArraySize = data.GetUpperBound(0); 
			
FileStream fs = new FileStream(	@"c:\m2_win\m2_windows\report.rpt", FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(data, 0,ArraySize);
fs.Close();

//showing the result
ReportDocument rep = new ReportDocument();
rep.Load(@"c:\m2_win\m2_windows\report.rpt");
crystalReportViewer1.ReportSource = rep;

Leider kommt immer an dieser Stelle "data = (byte[])myRow[0];" -> "umwandlung ungültig" als Fehlermeldung.
 
Ne Frage zwischendurch... Hab das mit dem Report auch eben getestet, ging nicht weil der den Konstruktor nicht gefunden hatte... brauch ich da nen Namespace ?
Wenn ja, welchen ? ;)
 
Zurück