Forum - C# / VB.NET
- Stampa C#
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
mlSEND è un listbox
Codice sorgente - presumibilmente C# / VB.NET
private void bPRINT_Click(object sender, EventArgs e)
{
if (printDialog1.ShowDialog() == DialogResult.OK)
{
printDialog1.Document = printDocument1;
printDocument1.PrinterSettings = printDialog1.PrinterSettings;
ls = mlSEND.Items;
printDocument1.Print();
}
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.PageUnit = GraphicsUnit.Pixel;
Font font = new System.Drawing.Font("Times New Roman", 12);
Single CharHeight = font.GetHeight(e.Graphics);
float TotalLines = e.MarginBounds.Height / CharHeight;
Int16 LineIndex = 1;
string Line;
float Y = e.MarginBounds.Top;
e.Graphics.RenderingOrigin = new Point(e.MarginBounds.Left, e.MarginBounds.Top);
Line = this.Text + Environment.NewLine + Environment.NewLine;
e.Graphics.DrawString(Line, font, Brushes.Black,
e.MarginBounds.Left, Y);
Y += CharHeight;
LineIndex += 2;
foreach (string ob in ls)
{
Line = ob;
e.Graphics.DrawString(Line, font, Brushes.Black,
e.MarginBounds.Left, Y);
Y += CharHeight;
LineIndex += 1;
}
}
la stampa mi si ferma alla prima pagina quando dovrebbero essercene almeno tre...come posso fare per stamparne di più?
Ultima modifica effettuata da lorenzo il 25/03/2009 alle 22:36
andrea.b89 (Ex-Member)
Pro
Messaggi: 129
Iscritto: 03/03/2009
Il fatto è che quando devi stampare il programma in modo logico stampa una pagina per volta, o per meglio dire stampa il contenuto di un pagina alla volta.
Per far si che il programma stampi N pagine, nel tuo caso 3, bisogno che gli venga segnalato se ci sono ulteriori pagine da stampare oltre a quella in fase di stampa.
Per fare ciò devi settare a True una proprietà del PrintPageEventArgs chiamata HasMorePages, come nel seguente esempio.
Codice sorgente - presumibilmente C# / VB.NET
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.HasMorePages = true;
}
Ovvio che in questo modo però stampi pagine all'infinito.
Per gestire il numero di pagine potresti fare un contatore nel seguente modo
Codice sorgente - presumibilmente C++
int numPagine = 3 ; //numero arbitrario
int pagStampate = 0 ;
private void printDocument1_PrintPage( object sender, System.Drawing .Printing .PrintPageEventArgs e)
{
pagStampate++ ;
if ( pagStampate < numPagine)
e.HasMorePages = true ;
}
A questo punto devi gestire il contenuto da stampare.
Metti di avere una listbox con N elementi da stampare.
Di default decidi di stampare 30 elementi per pagina.
Codice sorgente - presumibilmente C#
int numRigheTotali;
int numRighePerPagina = 30 ;
int numPagineStampate;
int numPagineTotali;
private void printDocument1_PrintPage( object sender, System.Drawing .Printing .PrintPageEventArgs e)
{
int tmpRighe = numPagineStampate == numPagineTotali - 1 ? numRigheTotali % numRighePerPagina : numRighePerPagina;
string riga;
int lineIndex = numPagineStampate * numRighePerPagina;
for ( int i = 0 ; i < tmpRighe; i++ )
{
riga = listBox1.Items [ lineIndex + i] .ToString ( ) ;
e.
Graphics .
DrawString ( riga ,
new Font
( "Times New Roman" , 12
) ,
Brushes.
Black ,
new PointF
( e.
PageBounds .
X , 15
* i
) ) ; }
numPagineStampate++;
if ( numPagineStampate < numPagineTotali)
e.HasMorePages = true;
}
private void button1_Click( object sender, EventArgs e)
{
printDialog1.Document = printDocument1;
if ( printDialog1.ShowDialog ( ) == DialogResult.OK )
{
numRigheTotali = listBox1.Items .Count ;
numPagineTotali = numRigheTotali / numRighePerPagina + 1 ;
printDocument1.Print ( ) ;
}
}
Nel form ho posizionato una listBox ed un button lasciando i nomi di default per evitare fraintendimenti.
Comunque questo è quanto.
Vedi se riesci ad adattarlo al tuo caso, e se hai ancora problemi vedrò di aiutari.
Spero di essere stato chiaro e di aiuto
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
grazie ho capito il concetto....adesso lo adatterò al mio caso