Condividi tramite


Stampa con l'anteprima di stampa (Windows Form .NET)

È comune nella programmazione Windows Form offrire l'anteprima di stampa oltre ai servizi di stampa. Per aggiungere facilmente i servizi di anteprima di stampa all'applicazione, usare un controllo PrintPreviewDialog in combinazione con la logica di gestione degli eventi PrintPage per la stampa di un file.

Per visualizzare in anteprima un documento di testo con un controllo PrintPreviewDialog

  1. In Visual Studio usare il riquadro Esplora soluzioni e fare doppio clic sul modulo da cui si desidera stampare. Verrà aperta la finestra di progettazione visiva.

  2. Nel riquadro Casella degli strumenti fare doppio clic sul PrintDocument componente e sul PrintPreviewDialog componente per aggiungerli al modulo.

  3. Aggiungere un oggetto Button al modulo oppure usare un pulsante già presente nel modulo.

  4. Nella finestra di progettazione visiva del modulo selezionare il pulsante . Nel riquadro Proprietà selezionare il pulsante Filtro eventi e quindi fare doppio clic sull'evento Click per generare un gestore eventi.

  5. Il Click codice evento deve essere visibile. All'esterno dell'ambito del gestore eventi, aggiungere due variabili di stringa privata alla classe denominata documentContents e stringToPrint:

    // Declare a string to hold the entire document contents.
    private string documentContents="";
    
    // Declare a variable to hold the portion of the document that
    // is not printed.
    private string stringToPrint="";
    
    ' Declare a string to hold the entire document contents.
    Private documentContents As String
    ' Declare a variable to hold the portion of the document that
    ' is not printed.
    Private stringToPrint As String
    
  6. Tornare al codice del Click gestore eventi, impostare la DocumentName proprietà sul documento da stampare e aprire e leggere il contenuto del documento nella stringa aggiunta in precedenza.

    string docName = "testPage.txt";
    string docPath = @"C:\";
    string fullPath = System.IO.Path.Combine(docPath, docName);
    printDocument1.DocumentName = docName;
    stringToPrint = System.IO.File.ReadAllText(fullPath);
    
    Dim docName As String = "testPage.txt"
    Dim docPath As String = "C:\Users\v-rsatao\Desktop\"
    Dim fullPath As String = System.IO.Path.Combine(docPath, docName)
    
    PrintDocument1.DocumentName = docName
    stringToPrint = System.IO.File.ReadAllText(fullPath)
    
  7. Come per la stampa del documento, nel gestore eventi PrintPage usare la proprietà Graphics della classe PrintPageEventArgs e il contenuto del file per calcolare le righe per pagina ed eseguire il rendering del contenuto del documento. Dopo aver disegnato ogni pagina, verificare se si tratta dell'ultima pagina e impostare la HasMorePages proprietà di PrintPageEventArgs conseguenza. L'evento PrintPage viene generato finché la proprietà HasMorePages non assume valore false. Al termine del rendering del documento, reimpostare la stringa da sottoporre a rendering. Assicurarsi inoltre che l'evento PrintPage sia associato al metodo di gestione degli eventi.

    Nota

    Se è stata implementata la stampa nell'applicazione, potrebbe essere già stato completato il passaggio 5 e 6.

    Nell'esempio di codice seguente il gestore eventi viene usato per stampare il file "testPage.txt" con lo stesso tipo di carattere usato nel form.

    void PrintDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {
        int charactersOnPage = 0;
        int linesPerPage = 0;
    
        // Sets the value of charactersOnPage to the number of characters
        // of stringToPrint that will fit within the bounds of the page.
        e.Graphics.MeasureString(stringToPrint, this.Font,
            e.MarginBounds.Size, StringFormat.GenericTypographic,
            out charactersOnPage, out linesPerPage);
    
        // Draws the string within the bounds of the page.
        e.Graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
        e.MarginBounds, StringFormat.GenericTypographic);
    
        // Remove the portion of the string that has been printed.
        stringToPrint = stringToPrint.Substring(charactersOnPage);
    
        // Check to see if more pages are to be printed.
        e.HasMorePages = (stringToPrint.Length > 0);
    
        // If there are no more pages, reset the string to be printed.
        if (!e.HasMorePages)
            stringToPrint = documentContents;
    }
    
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    
        Dim charactersOnPage As Integer = 0
        Dim linesPerPage As Integer = 0
    
        ' Sets the value of charactersOnPage to the number of characters 
        ' of stringToPrint that will fit within the bounds of the page.
        e.Graphics.MeasureString(stringToPrint, Me.Font, e.MarginBounds.Size,
            StringFormat.GenericTypographic, charactersOnPage, linesPerPage)
    
        ' Draws the string within the bounds of the page.
        e.Graphics.DrawString(stringToPrint, Me.Font, Brushes.Black,
            e.MarginBounds, StringFormat.GenericTypographic)
    
        ' Remove the portion of the string that has been printed.
        stringToPrint = StringToPrint.Substring(charactersOnPage)
    
        ' Check to see if more pages are to be printed.
        e.HasMorePages = stringToPrint.Length > 0
    
        ' If there are no more pages, reset the string to be printed.
        If Not e.HasMorePages Then
            stringToPrint = documentContents
        End If
    
    End Sub
    
  8. Impostare la proprietà Document del controllo PrintPreviewDialog sul componente PrintDocument nel form.

    printPreviewDialog1.Document = printDocument1;
    
    PrintPreviewDialog1.Document = PrintDocument1
    
  9. Chiamare il metodo ShowDialog sul controllo PrintPreviewDialog . Si noti il codice evidenziato riportato di seguito, in genere si chiama ShowDialog dal Click metodo di gestione degli eventi di un pulsante. Chiamando il metodo ShowDialog viene generato l'evento PrintPage e viene eseguito il rendering dell'output sul controllo PrintPreviewDialog . Quando l'utente seleziona l'icona di stampa nella finestra di dialogo, l'evento PrintPage viene generato di nuovo, inviando l'output alla stampante anziché alla finestra di dialogo di anteprima. Di conseguenza, la stringa viene reimpostata alla fine del processo di rendering nel passaggio 4.

    L'esempio di codice seguente illustra il metodo di gestione degli eventi Click per un pulsante nel form. Il metodo di gestione degli eventi chiama i metodi per leggere il documento e visualizzare la finestra di dialogo anteprima di stampa.

    private void Button1_Click(object sender, EventArgs e)
    {
        string docName = "testPage.txt";
        string docPath = @"C:\";
        string fullPath = System.IO.Path.Combine(docPath, docName);
        printDocument1.DocumentName = docName;
        stringToPrint = System.IO.File.ReadAllText(fullPath);
    
        printPreviewDialog1.Document = printDocument1;
    
        printPreviewDialog1.ShowDialog();
    }
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        Dim docName As String = "testPage.txt"
        Dim docPath As String = "C:\Users\v-rsatao\Desktop\"
        Dim fullPath As String = System.IO.Path.Combine(docPath, docName)
    
        PrintDocument1.DocumentName = docName
        stringToPrint = System.IO.File.ReadAllText(fullPath)
    
        PrintPreviewDialog1.Document = PrintDocument1
    
        PrintPreviewDialog1.ShowDialog()
    
    End Sub
    

Vedi anche