Generazione di etichette con numeri progressivi

di il
5 risposte

Generazione di etichette con numeri progressivi

Ciao, vorrei creare un programmino per la stampa di etichette con numero progressivo, qui di seguito il codice.
Però sono mesi che sbatto la testa nel tentativo di incrementare ad ogni pagina il numero "startpage" senza mai riuscirci...
in pratica in una windows form chiedo all'utente la pagina di partenza e quante etichette stampare: ad esempio pagina di partenza 10; nr. 4 etichette da stampare e mi genererà 4 etichette con numeri 10,11,12,13

potreste essermi di aiuto?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StampaEtichetteBancali
{
public partial class Form1 : Form
{
int startPage = 0;
int pageCount = 0;
int pageLimit = 0;

public Form1()
{
InitializeComponent();
}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{


{ // Create a font myFont
Font myfont = new Font("Arial", 75, FontStyle.Bold, GraphicsUnit.Point);
Font myfont2 = new Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point);

Rectangle rect1 = new Rectangle(5, 5, 340, 207);

// text centered on the page.
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;


if (startPage < pageLimit)
{

e.Graphics.DrawString(startPage + "/" + txt_departmnt.Text, myfont, Brushes.Black, rect1, stringFormat);


{
Rectangle rect2 = new Rectangle(5, 5, 340, 207);
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(rect2));

}

startPage++;

}

}
}


private void btn_stampa_Click(object sender, EventArgs e)
{

if (Int32.TryParse(txt_startnr.Text, out startPage) &&
Int32.TryParse(txt_qty.Text, out pageCount))

{
pageLimit = startPage + pageCount;

int copie = Convert.ToInt16(txt_qty.Text);

//Set the number of copies of the document
printDocument1.PrinterSettings.Copies = (short)copie;
printDocument1.PrinterSettings.PrinterName = "Microsoft Print to PDF";
printDocument1.Print();
}
else { }
}
}
}

5 Risposte

  • Re: Generazione di etichette con numeri progressivi

    albepisti ha scritto:


    Ciao, vorrei creare un programmino per la stampa di etichette con numero progressivo, qui di seguito il codice. [...]
    Il codice va formattato usando l'apposito pulsantino </>.

    Inoltre, dovresti descrivere un po' la logica di quello che hai già scritto, cosa funziona, cosa invece da errore o si comporta in modo errato, andando nel dettaglio, così da fornire un quadro più esaustivo della situazione e del problema, dando così una possibilità di aiutarti concreta.

    Ciao!
  • Re: Generazione di etichette con numeri progressivi

    Ok

    è un semplice programmino nel quale chiedo di imputare quante etichette stampare e a partire da quale numero.
    Mi piacerebbe che fossero generate tante pagine quanto è la quantità imputata, però incrementata:
    se parto da 1 e voglio 4 etichette, verranno emesse 4 pagine ognuna con numero incrementale a partire da 1 (una etichetta col nr. 1, una etichetta col nr.2, ecc.)
    il programma così come è scritto funziona senza errori, ma genera quattro pagine con il medesimo nr.
    altre prove precedentemente fatte generano pagine con numeri sovrapposti (forse perchè ho fatto girare l'incremento all'interno del printdocument)
    è chiaro che manca qualcosa ma ancora non capisco dove sbaglio

    Grazie per la comprensione
  • Re: Generazione di etichette con numeri progressivi

    albepisti ha scritto:


    è un semplice programmino nel quale chiedo di imputare quante etichette stampare e a partire da quale numero.
    Ok, però avere il codice opportunamente formattato sarebbe d'aiuto per comprendere meglio la logica che hai scritto, ma dato che non l'hai messo ho provveduto io incollandolo nel mio editor.

    albepisti ha scritto:


    Mi piacerebbe che fossero generate tante pagine quanto è la quantità imputata, però incrementata:
    se parto da 1 e voglio 4 etichette, verranno emesse 4 pagine ognuna con numero incrementale a partire da 1 (una etichetta col nr. 1, una etichetta col nr.2, ecc.)
    il programma così come è scritto funziona senza errori, ma genera quattro pagine con il medesimo nr.
    Diciamo che se l'obiettivo è scrivere quattro pagine numerate progressivamente, stando a quello che dici, e invece il programma riporta lo stesso per tutte, allora non funziona.

    albepisti ha scritto:


    altre prove precedentemente fatte generano pagine con numeri sovrapposti (forse perchè ho fatto girare l'incremento all'interno del printdocument)
    è chiaro che manca qualcosa ma ancora non capisco dove sbaglio
    Ho visto che fai uso del componente PrintDocument: hai dato un'occhiata alla documentazione ufficiale prima di iniziare ad adoperarlo?

    Andare per tentativi può essere una strada, ma spesso non porta al risultato desiderato e quando non si ottengono gli effetti voluti, è necessario fermarsi un momento e fare un passo indietro, leggendo come prima cosa la documentazione: essa contiene anche degli esempi, come in questo caso, che mostrano l'uso corretto e fanno capire prima di subito gli eventuali errori commessi.

    Ad esempio, vedo che hai impostato la proprietà PrinterSettings.Copies: la relativa documentazione dice che "imposta il numero di copie del documento da stampare", quindi se tu scrivi:

    printDocument1.PrinterSettings.Copies = (short)copie;

    dove "copie" ha il valore di 4, otterrai 4 copie identiche dello stesso documento, ovvero 4 copie del documento che è apparentemente formato da una sola pagina, con una sola etichetta.

    E ancora, devi analizzare l'esempio della documentazione e gestire correttamente la proprietà HasMorePages dell'oggetto che viene passato all'evento PrintPage, indicando quando è necessario produrre una nuova pagina, altrimenti lo "stampatore" si ferma di conseguenza.

    Ciao!
  • Re: Generazione di etichette con numeri progressivi

    Il codice è copiato e trascritto senza nessuna congnizione, non hai fatto nessun loop, non hai messo il codice nel tag code, neanche dopo richiesta...
    Mi sembra che ti serva solo un codice che funzonicchi, ho messo il loop, ora stampa su una pagina ma non c'è nessun controllo. Se vai oltre la lunghezza della pagina, ti perdi le etichette, non stampa neanche su più colonne, che sarebbe molto facile da fare.
    
    using System;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    
    namespace StampaEtichetteBancali
    {
        public partial class Form1 : Form
        {
            int numerodipartenza = 0;
            int quanteetichette = 0;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                // Crea myFont
                Font myfont = new Font("Arial", 35, FontStyle.Bold, GraphicsUnit.Point);
                Font myfont2 = new Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point);
                int rigapartenza = 10;
                int colonnapartenza = 10;
                int gaptralerighe = 20;
                int altezzaetichetta = 207;
                int larghezzaetichetta = 340;
                int numerodifine = quanteetichette + numerodipartenza; // chiude il ciclo
    
                // testo al centro del rettangolo.
                StringFormat stringFormat = new StringFormat();
                stringFormat.Alignment = StringAlignment.Center;
                stringFormat.LineAlignment = StringAlignment.Center;
              
                while (numerodipartenza < numerodifine) // ciclo
                {
                    Rectangle rect1 = new Rectangle(colonnapartenza, rigapartenza, larghezzaetichetta, altezzaetichetta);
                    e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(rect1));
                    e.Graphics.DrawString(numerodipartenza + "/" + txt_departmnt.Text, myfont, Brushes.Black, rect1, stringFormat);
    
                    rigapartenza += altezzaetichetta + gaptralerighe; // incremento coordinata di riga.
                    numerodipartenza++; // incremento numero etichetta.
                }
                
            }
    
            private void btn_stampa_Click(object sender, EventArgs e)
            {
                if (Int32.TryParse(txt_startnr.Text, out numerodipartenza) &&  Int32.TryParse(txt_qty.Text, out quanteetichette))
                {
                    // numero di copie e nome stampante.
                    printDocument1.PrinterSettings.Copies = 3;
                    printDocument1.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"; // "Microsoft Office Document Image Writer"; "Microsoft XPS Document Writer";
                    printDocument1.Print();
                }
            }
        }
    }
    
  • Re: Generazione di etichette con numeri progressivi

    Buongiorno
    dopo un po' di tempo e vari tentativi, ma anche grazie ai vostri suggerimenti, sono finalmente venuto a capo della mia richiesta.
    Per chi avesse bisogno. allego il codice:
    
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Printing; //aggiunto
    
    
    namespace hasmorepages
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            // Dichiarazione delle variabili locali (aggiungere using System.Drawing.Printing;)
            PaperSize paperSize = new PaperSize("papersize", 90, 55);   // set dimensioni pagina
            int numerodipartenza = 0;
            int itemperpage = 0;                                        // elementi per pagina
            
    
            private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
            {
                // determino i tipi di font
                Font myfont1 = new Font("Arial", 16, FontStyle.Bold, GraphicsUnit.Point);
                Font myfont2 = new Font("Arial", 4, FontStyle.Bold, GraphicsUnit.Point);
    
                // trasformo le textbox in variabili
                int nrinizio = Convert.ToInt16(txt_startnr.Text);
                int quante = Convert.ToInt16(txt_qty.Text);
                int nrfine = nrinizio + quante;
                
                float currentY = 10;    // inizio a stampare da qui inserendo la data
                e.Graphics.DrawString(dateTimePicker1.Text, myfont2, Brushes.Black, 30, currentY);
                currentY += 5;
    
                
                while (numerodipartenza <= nrfine) // inizio il ciclo di generazione dei numeri progressivi a partire dal nr inputato
                {
                    e.Graphics.DrawString(numerodipartenza + "/" + txt_departmnt.Text, myfont1, Brushes.Black, 18, currentY); // stampo ogni nr
    
                    currentY += 40;             // spazio tra i ogni riga
                    numerodipartenza++;         // incremento il numero
    
                    if (itemperpage < 0)        // ad ogni numero generato cambio pagina
                    {
                        itemperpage += 1;       
                        e.HasMorePages = false; 
                    }
                    else                         
                    {
                        itemperpage = 0;        
                        e.HasMorePages = true;  
                        return;                 
                    }
    
                    
                }
            }
            private void button1_Click(object sender, EventArgs e) //ANTEPRIMA
            {
                itemperpage = 0;
                
                numerodipartenza = Convert.ToInt16(txt_startnr.Text);
                
                {
                    printPreviewDialog1.Document = printDocument1;
    
                    ((ToolStripButton)((ToolStrip)printPreviewDialog1.Controls[1]).Items[0]).Enabled = false;
                    // disabilito la stampa diretta dalla anteprima così quando si fa clic sul pulsante Stampa l'evento PrintPage si attiva di nuovo.
    
                    printDocument1.DefaultPageSettings.PaperSize = paperSize;
                    printPreviewDialog1.ShowDialog();
                }
                
    
            }
    
            private void button2_Click(object sender, EventArgs e) //STAMPA
            {
                itemperpage = 0;
    
                numerodipartenza = Convert.ToInt16(txt_startnr.Text);
    
                printDocument1.PrinterSettings.PrinterName = "Microsoft Print to PDF";
                printDocument1.DefaultPageSettings.PaperSize = paperSize;
                printDocument1.Print();
    
            }
        }
    }
    
    
    
Devi accedere o registrarti per scrivere nel forum
5 risposte