Skriv ut genom att använda förhandsgranskning

Det är vanligt i Windows Forms-programmering att erbjuda förhandsgranskning utöver utskriftstjänster. Ett enkelt sätt att lägga till förhandsgranskning i ditt program är att använda en PrintPreviewDialog kontroll i kombination med PrintPage logik för händelsehantering för att skriva ut en fil.

Förhandsgranska ett textdokument med en PrintPreviewDialog-kontroll

  1. I Visual Studio använder du fönstret Solution Explorer och dubbelklickar på formuläret som du vill skriva ut från. Detta öppnar den visuella designern.

  2. I fönstret Toolbox dubbelklickar du på både komponenten PrintDocument och komponenten PrintPreviewDialog för att lägga till dem i formuläret.

  3. Lägg antingen till en Button i formuläret eller använd en knapp som redan finns i formuläret.

  4. Välj knappen i formulärets visuella designer. I fönstret Egenskaper väljer du filterknappen Händelse och dubbelklickar sedan på händelsen Click för att generera en händelsehanterare.

  5. Händelsekoden Click ska vara synlig. Utanför händelsehanterarens omfång lägger du till två privata strängvariabler i klassen med namnet documentContents och 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. Tillbaka i händelsehanterarkoden för Click tilldelar du egenskapen DocumentName det dokument du vill skriva ut, och öppnar och läser dokumentets innehåll till strängen som du tidigare deklarerade.

    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. Som när du skriver ut dokumentet använder du PrintPage-egenskapen för klassen Graphics och filinnehållet i PrintPageEventArgs händelsehanteraren för att beräkna rader per sida och återge dokumentets innehåll. När varje sida har ritats kontrollerar du om det är den sista sidan och anger egenskapen HasMorePages för PrintPageEventArgs. Händelsen PrintPage utlöses tills HasMorePages är false. När dokumentet är klart återställer du strängen som ska renderas. Se också till att den PrintPage händelsen är associerad med dess händelsehanteringsmetod.

    Anmärkning

    Om du har implementerat utskrifter i programmet kanske steg 5 och 6 redan har slutförts.

    I följande kodexempel används händelsehanteraren för att skriva ut filen "testPage.txt" med samma teckensnitt som används i formuläret.

    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. Ange Document-egenskapen för PrintPreviewDialog-kontrollen till PrintDocument komponenten i formuläret.

    printPreviewDialog1.Document = printDocument1;
    
    PrintPreviewDialog1.Document = PrintDocument1
    
  9. Anropa metoden ShowDialog på kontrollen PrintPreviewDialog. Observera följande markerade kod, du anropar ShowDialog vanligtvis från Click händelsehanteringsmetoden för en knapp. Anrop av ShowDialog genererar PrintPage-händelsen och återsänder resultatet till PrintPreviewDialog-kontroll. När användaren väljer utskriftsikonen i dialogrutan utlöses händelsen PrintPage igen och skickar utdata till skrivaren i stället för förhandsgranskningsdialogrutan. Därför återställs strängen i slutet av återgivningsprocessen i steg 4.

    I följande kodexempel visas metoden Click händelsehantering för en knapp i formuläret. Händelsehanteringsmetoden anropar metoderna för att läsa dokumentet och visa dialogrutan för förhandsgranskning.

    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
    

Se även