Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C#] System.Drawing - Classe specifica per disegnare le pagine

    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
    Emanuele Boccaletti
    _____________________________________
    www.i23.eu
    emanuele@i23.eu

  2. #2
    Hai già usato MeasureString per misurare le dimensione di tutto il testo. Quindi non vedo il problema. Basta che controlli se la somma di tutte le altezze è minore di e.PageBounds.Height.
    Detto questo, scrivere una classe DocumentPage è poco pratico perché a priori non sai cosa ci andrà dentro quella pagina: arrivi a scoprirlo solo dopo che sei arrivato alla fine della stampa. Sarebbe meglio una classe che si occupi generalmente di stampare tutti i dati, senza preoccuparsi di quante pagine ci saranno.

    P.S.: clsProdotto, Pagina_Documento, brr...
    http://10rem.net/articles/net-naming...best-practices
    P.P.S.: System.Drawing è un namespace, non una classe.

  3. #3
    Grazie per la spiegazione!

    P.S.: clsProdotto, Pagina_Documento, brr... http://10rem.net/articles/net-namin...-best-practices P.P.S.: System.Drawing è un namespace, non una classe.
    -vergogna- :P
    Emanuele Boccaletti
    _____________________________________
    www.i23.eu
    emanuele@i23.eu

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.