14. december 2006 - 19:23Der er
4 kommentarer og 1 løsning
uendelig løkke ved PrintPreviewDialog
jeg bruger denne kode:
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { int x = e.MarginBounds.Left; int y = e.MarginBounds.Top; int linesPrinted = 0; Brush brush = new SolidBrush(SystemColors.ControlDark);
til at udskrive et listview på min printer og det virker helt fint, så længe at der ikke er flere linjer, end det kan være på een side. hvis det fylder mere end en side, går den i en uendelig løkke, når den skal tælle siderne op i preview-dialogen. hvis der f.eks. er 70 linjer (der kan være 64 per side) starter den forfra når den når til 64 (jeg har prøvet at udskrive "linesPrinted") og det gør den så, indtil jeg stopper den). koden har jeg taget fra et andet program, hvor det virker fint, der er det dog bare en richtextbox der bliver udksrevet fra...
håber der er nogen der kan hjælpe, kan ikke finde ud af hvad dælen der går galt.
I et inbound callcenter, hvor identiteten på den, der ringer ind, skal bekræftes, kan kontrollen nu foregå i telefonkøen. Det understøtter fem centrale KPI'er for callcentre.
Hmmm... Men du beder den jo også om at starte forfra så vidt jeg kan se. Du looper altid over den komplette liste, og hvis linierne ikke kan være på en side, siger du at eventet skal rejses igen med "HasMorePages = true", hvorefter samme kode udføres igen.
void PrintDocumentPrintPage(object sender, PrintPageEventArgs printPageEventArgs) { int leftMargin = printPageEventArgs.MarginBounds.Left; int topMargin = printPageEventArgs.MarginBounds.Top; float y = 0;
// Calculate the number of lines per page. float linesPerPage = printPageEventArgs.MarginBounds.Height / this.listView1.Font.GetHeight(printPageEventArgs.Graphics);
int linesToPrint = this.listView1.Items.Count; int linesPrintedThisPage = 0;
// Print each line of the file. while (linesPrintedThisPage < linesPerPage && this.counterPrintedLines < linesToPrint) { ListViewItem item = this.listView1.Items[counterPrintedLines]; string line = string.Format("{0}", item.Text);
y = topMargin + (linesPrintedThisPage * this.listView1.Font.GetHeight(printPageEventArgs.Graphics));
printPageEventArgs.Graphics.DrawString(line, this.listView1.Font, Brushes.Black, leftMargin, y, new StringFormat()); linesPrintedThisPage++; this.counterPrintedLines++; }
Bør naturligvis udvides så subitems tegnes med. Derudover bør målingen af fontstørrelse ske på det enkelte item, og ikke som her globalt, ved mindre at din udskrift altså kun anvender én fontstørrelse.
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { int x = e.MarginBounds.Left; int y = e.MarginBounds.Top; Brush brush = new SolidBrush(SystemColors.ControlDark); Font font = new Font("Verdana", 10);
while (linesPrinted < lvwPrint.Items.Count) { x = e.MarginBounds.Left; while (columnsPrinted < lvwPrint.Columns.Count) { ListViewItem item = this.lvwPrint.Items[linesPrinted]; e.Graphics.DrawString(item.SubItems[columnsPrinted].Text, font, brush, x, y); x += FindMaxSize(columnsPrinted); columnsPrinted++; } columnsPrinted = 0; linesPrinted++; y += 15; if (y >= e.MarginBounds.Bottom) { e.HasMorePages = true; return; } } e.HasMorePages = false; }
den skriver en hel linje ad gangen i stedet for først een kolonne og derefter den næste... det eneste den ikke kan tage højde for, er hvis det er bredere end een side, men det får jeg ikke brug for...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.