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:
mentre DrawRowProduct è così strutturata: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++; } } }
dove elencoProdotti è un Generics popolato con il mio oggetto clsProdottocodice: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; }
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

Rispondi quotando
