Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C#] foreach e stampa

  1. #1

    [C#] foreach e stampa

    Salve a tutti. Ho questo codice che serve a stampare dei dati contenuti in file xml in modo da avere su carta un indice di dove sono posizionati alcuni file.
    codice:
    void printDocument_PrintPage(object sender, PrintPageEventArgs e)
            {
                
                PrintDocument document = ((PrintDocument)sender);
                
                e.HasMorePages = false;
                //STAMPA LEGENDA
                e.Graphics.DrawString("ELEMENTO", new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))), Brushes.Black, new PointF(e.PageSettings.PaperSize.Width - 800, e.PageSettings.PaperSize.Height - 1140));
                e.Graphics.DrawString("DESCRIZIONE", new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))), Brushes.DarkRed, new PointF(e.PageSettings.PaperSize.Width - 680, e.PageSettings.PaperSize.Height - 1140));
                e.Graphics.DrawString("COORDINATE", new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))), Brushes.Black, new PointF(e.PageSettings.PaperSize.Width - 130, e.PageSettings.PaperSize.Height - 1140));
                
    
    
                //CICLO DI STAMPA DEI CONTENUTI
                System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Execution.ListaContenutiForm));
                foreach (Model.Contenuto contenuto in listaContenuti)
                {
                    //verifico che siano contenuti validi
                    if (!(contenuto.getNomeContenuto().Equals("Play")) && !(contenuto.getNomeContenuto().Equals("Pausa")) && !(contenuto.getNomeContenuto().Equals("Stop")))
                    {
                         
                        coord = contenuto.getCoordinate();
                        this.coordinate = alfabeto[coord[1] - 1].ToString() + coord[0];
                        this.nomeElemento = contenuto.getNomeContenuto();
                        this.pathElemento = contenuto.getVideoPath();
                        this.descrizioneElemento = contenuto.getDescrizione();
                        string tipo = pathElemento.Substring(pathElemento.Length - 3, 3);
    
                        
                            calc1 = (1100 - (i * 80));
                            e.Graphics.DrawString(nomeElemento, new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))), Brushes.Black, new PointF(e.PageSettings.PaperSize.Width - 800, e.PageSettings.PaperSize.Height - calc1));
                            e.Graphics.DrawString(descrizioneElemento, new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))), Brushes.DarkRed, new PointF(e.PageSettings.PaperSize.Width - 680, e.PageSettings.PaperSize.Height - calc1));
                            e.Graphics.DrawString(coordinate, new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))), Brushes.Black, new PointF(e.PageSettings.PaperSize.Width - 100, e.PageSettings.PaperSize.Height - calc1));
                            e.Graphics.DrawString(pathElemento, new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))), Brushes.Black, new PointF(e.PageSettings.PaperSize.Width - 800, e.PageSettings.PaperSize.Height - (1060 - (i * 80))));
                        
                        
                      
    
                        i++;
                        
                    }
                }
                
            }
    Il classico codice per la stampa con .net.
    Il problema è che ad un certo punto dovrei usare
    codice:
    e.HasMorePages = true;
    per poter usare una nuova pagina (quando i raggiunge il valore di 13). Se lo faccio, però, esce giustamente dal foreach e ricomincia da capo chiamando la funzione di stampa sulla nuova pagina, quella all'inizio, sia che metta un break (esce subito), sia che non lo metta (finisce il foreach). Così facendo, però il foreach reinizia da capo resettando tutti gli eventuali contatori che ho usato, stampando un numero infinito di pagine. Esiste un modo per far partire il foreach da un valore predefinito (nel mio caso un multiplo di 13)?

    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Si, invece di usare un ciclo For... Each usa un ciclo For...Next..Step

    Sbagliare è umano, perseverare è diabolico.

  3. #3
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    no, il problema non è nel foreach!
    sposta i contatori fuori dal metodo void printDocument_PrintPage
    I got the remedy

  4. #4
    Visto che, come scrivi te, quando arriva a 13 deve iniziare in una nuova pagina, devi semplicemente:

    1. controllare il valore della variabile contatore i
    2. se i = 12 allora i = 1


    Ciao

  5. #5
    Originariamente inviato da MdE2005
    Visto che, come scrivi te, quando arriva a 13 deve iniziare in una nuova pagina, devi semplicemente:

    1. controllare il valore della variabile contatore i
    2. se i = 12 allora i = 1


    Ciao
    Avevo già provato, ma facendo così riparte anche il foreach.
    Proverò gli altri consigli, grazie!

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.