Hallo,
ich hab mal wieder ein Problem.
Ich versuche seit heute mittag es hinzubekommen Einträge einer Listbox zu drucken.
Habe hier das Forum durchsucht, so ziemlich alles probiert was nach einer Lösung aussehen könnte und google hab ich auch zum qualmen gebracht.
Das hier ist der momentane Codestand den ich habe, aber es kommt immer nur eine leere Seite.
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g = e.Graphics;
float lineH = g.MeasureString("X", new Font("Verdana", 10, FontStyle.Regular)).Height;
int y = 100;
foreach (string str in listBox1.Items)
{
g.DrawString(str, new Font("Verdana", 10, FontStyle.Regular), Brushes.Black, 50, 100);
y += (int)lineH;
if (y >= e.MarginBounds.Bottom)
{
e.HasMorePages = true;
return;
}
}
e.HasMorePages = false;
}
private void vorschauToolStripMenuItem_Click(object sender, EventArgs e)
{
if (printPreviewDialog1.ShowDialog() == DialogResult.OK)
{
printDocument1.Print();
}
}
private void druckenToolStripMenuItem1_Click(object sender, EventArgs e)
{
PrintDialog printDialog1 = new PrintDialog();
printDialog1.Document = printDocument1;
DialogResult result = printDialog1.ShowDialog();
if (result == DialogResult.OK)
{
printDocument1.Print();
}
}
Es gibt hier im Forum ein Thread wo auch jemand das Problem mit der leeren Seite hat, aber irgendwie haben mich die Hinweise in dem Thread nicht weiter gebracht.
Kann mir hier jemand nen hilfreichen Schups geben ?
Läuft er überhaupt in den printDocument1_PrintPage rein ?
Sorry das ich jetzt so blöd frage, aber wie überprüf ich das ?
Bin ziemlicher Neuling auf dem Gebiet.
Hallo Mani!
Mach einfach einen Aufruf von
MessageBox.Show("blabla");
am Anfang der Methode printDocument1_PrintPage rein und wenn die MessageBox dann erscheint, weißt du, dass er reinläuft.
Gruß,
SimonKnight6600
Und selbst wenn er die Funktion aufruft, wird es "lustig".
Sollte tatsächlich mehr als eine Seite zu drucken sein, wird nämlich dann
gedruckt, bis das Papier alle ist.
Bei jedem betreten der Funktion wird von vorne gedruckt, und das
auch noch immer an die selbe Position.
Und Irgendwann wird auch der Speicher knapp, weil die Font-Handles nicht
Disposed werden.
Original von Programmierhans
Läuft er überhaupt in den printDocument1_PrintPage rein ?
Anscheinend tut er dies nicht.
Ne Idee warum nicht ?
Kein Handler auf PrintPage attached ?
Asche auf mein Haupt, kannst du das bitte für nen totalen Noob übersetzen ?
//PrintPage anschnallen
printDocument1.PrintPage+=new PrintPageEventHandler(printDocument1_PrintPage);
Das war die Lösung.
Ich danke dir.
Ausdruck rennt zwar noch nicht richtig und sieht bisschen dumm aus, aber das bekomm ich denke ich in den Griff.
Vielen Dank nochmal.
Setze Breakpoints in Deinem Code dann siehst Du was abläuft und kannst Variablen prüfen usw...
in VS ist es bei Standard-Einstellungen F9
So, nachdem die Hitze erstmal vorbei ist trau ich mich auch wieder an mein Laptop 🙂
Original von FZelle
Und selbst wenn er die Funktion aufruft, wird es "lustig".Sollte tatsächlich mehr als eine Seite zu drucken sein, wird nämlich dann
gedruckt, bis das Papier alle ist.Bei jedem betreten der Funktion wird von vorne gedruckt, und das
auch noch immer an die selbe Position.Und Irgendwann wird auch der Speicher knapp, weil die Font-Handles nicht
Disposed werden.
Ich hab das Forum jetzt mehrmals durchsucht nach dem drucken mehrerer Seiten.
Ich bin heute leider nicht zur Lösung gekommen.
private void printDocument1_PrintPage(int seite, object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g = e.Graphics;
float lineH = g.MeasureString("X", new Font("Verdana", 10, FontStyle.Regular)).Height;
int y = 100;
int z = 1;
for (int i = 0; i < listBox1.Items.Count; i++)
{
g.DrawString("(" + z + ") " + listBox1.Items[i].ToString(), new Font("Verdana", 10, FontStyle.Regular), Brushes.Black, 50, y);
y += (int)lineH;
if (y >= e.MarginBounds.Bottom)
{
e.HasMorePages = true;
return;
}
z++;
}
e.HasMorePages = false;
}
Ok, sind mehr als 1 Seite da tritt das e.HasMorePages = true; in kraft, die for Schleife wird neu begonnen und es gibt endlosseiten.
Das hab ich soweit verstanden.
Wie übergeb ich denn dann jetzt die aktuelle Stelle der Listboxeinträge an die printDocument1_PrintPage Funktion ?
Wenn ich diese übergabe habe dann brauch ich ja im Grunde nur die For-Schleife daran anpassen.
Das mit dem Dispose versuch ich jetzt mal in den Kopf zu bekommen.
Ich glaub ich werd mir doch mal endlich nen Buch dazu besorgen.
Jetzt hab ich mal wieder etwas mehr Zeit und steh noch vor gleichem Problem.
Hat niemand nen heissen Tip für mich wie ich konkret das endlosdrucken verhinder ?
Das ist doch garnicht so schwer.
BEVOR Du die Printroutine anwirfst, setzt Du alle Variablen, die benötigt werden auf einen StartWert,
und am Ende löscht Du alles.
Das PrintDokument hat hierzu BeginPrint und EndPrint vorgesehen.