Buongiorno a tutti, ho fatto qualche ricerca ma non sono riuscito a trovare una risposta che mi soddisfacesse alla mia richiesta, quindi provo a porvi questo quesito.
Ho sviluppato un'applicazione per la gestione di un Catalogo (database SQLite), gestione prodotti, tipologie, marchi e modelli.
La gestione funziona correttamente e riesco a pistolettare le cosette che mi servono, ora però sono in difficoltà con la stampa del catalogo.
Inizialmente ho utilizzato l'evento "printDocument1_PrintPage(object sender, PrintPageEventArgs e)" per generare tutto il mio lavoro, per ogni pagina del catalogo andavo ad inserire un prodotto mediante questa funzione:
codice:
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
//Imposto l'unità di misura in millimetri
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
Margins pageMargins = new Margins(15,15,10,10);
e.PageSettings.Margins = pageMargins;
if (_lastProdIndex <= elencoProdotti.Count)
{
clsProdotto myProdotto = elencoProdotti[_lastProdIndex];
rowHeight += DrawRowProduct(e.Graphics, myProdotto, -100 + (rowHeight));
e.HasMorePages = ++_lastProdIndex < elencoProdotti.Count;
if (e.HasMorePages)
{
printPreviewControl1.Rows++;
paginaCorrente++;
}
}
}
mentre DrawRowProduct è così strutturata:
codice:
private int DrawRowProduct(Graphics gr, int yStartPosition, clsProdotto myProdotto)
{
int spaceWidth = 165;
int spaceHeight = 0;
int xStartPosition = -100;
Font smallFont = new Font("Arial", 6);
Font baseFont = new Font("Arial", 8);
Font boldFont = new Font("Arial", 10, FontStyle.Bold);
string nomeProdotto = myProdotto.Nome;
string descProdotto = myProdotto.Descrizione;
int stringLen = nomeProdotto.Length;
foreach (clsTraduzione prodTradotto in myProdotto.Traduzioni)
{
if (prodTradotto.IdField == "NOME") nomeProdotto += " / " + prodTradotto.Traduzione;
if (stringLen > 70)
{
stringLen = 0;
nomeProdotto += "\r\n";
}
else
stringLen = nomeProdotto.Length;
if (prodTradotto.IdField == "DESCRIZIONE") descProdotto += "\r\n\r\n" + prodTradotto.Traduzione;
}
gr.DrawString(nomeProdotto, boldFont, Brushes.Black, xStartPosition, yStartPosition + 1);
SizeF sizeString = gr.MeasureString("Prodotto: " + nomeProdotto, boldFont);
int hString = Int32.Parse(sizeString.Height.ToString().Substring(0, sizeString.Height.ToString().IndexOf(","))) + 5;
spaceHeight += hString;
gr.DrawString("Codice: " + myProdotto.Sku, boldFont, Brushes.Black, xStartPosition, yStartPosition + hString);
sizeString = gr.MeasureString("Codice: " + myProdotto.Sku, boldFont);
hString = Int32.Parse(sizeString.Height.ToString().Substring(0, sizeString.Height.ToString().IndexOf(","))) + 30;
spaceHeight += hString;
RectangleF descRect = new RectangleF();
descRect.Width = spaceWidth + (-60);
descRect.X = 0;
descRect.Y = yStartPosition + hString;
gr.DrawString(descProdotto, baseFont, Brushes.Black, descRect);
sizeString = gr.MeasureString(descProdotto, baseFont);
hString = Int32.Parse(sizeString.Height.ToString().Substring(0, sizeString.Height.ToString().IndexOf(",")));
spaceHeight = spaceHeight + hString + 5;
Bitmap imageProd = prodImage(myProdotto.Foto);
gr.DrawImage(imageProd, xStartPosition, yStartPosition + hString);
int imageMMHeight = ((imageProd.Height*71)/270);
hString = (hString < imageMMHeight) ? imageMMHeight : hString;
spaceHeight += hString;
return spaceHeight;
}
dove elencoProdotti è un Generics popolato con il mio oggetto clsProdotto
Quello che ora vorrei fare è una classe Pagina_Documento che deve popolare un Generics List<Pagina_Documento> che vado a scorrere nella printDocument1_PrintPage per poi disegnare la pagina completa.
Praticamente vorrei calcolare l'altezza di OGNI descrizione del prodotto nel catalogo e decidere SE nella stessa pagina posso inserire il prodotto successivo o devo "andare in un'altra pagina".
Chiedevo il Vostro consiglio per fare questa cosa perché.... non ci sto più con la testa e sto iniziando ad impazzire....
Se io creassi la classe Pagina_Documento potrei fare in modo che DENTRO ci fossero i metodi per disegnarla e calcolare le altezze ed infine così potrei richiamare direttamente queste da printDocument1_PrintPage... ma non so come fare perché non conosco molto bene la classe System.Drawing.
Grazie in anticipo a tutti quelli che possono aiutarmi.
Emanuele