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