2012-10-04 17 views
6

Utilizzo Visual Studio 2010 C# Applicazione Windows Form + MySql Ho un visualizzatore di report che funziona al 100%. Il reportviewer è pieno di dati del mio database, si vede clicco sul pulsante per stampare e stampa ... MA, il mio cliente non vuole cliccare su questo pulsante, vuole stampare automaticamente. Quando chiamo ReportViewer si stampa da solo senza bisogno di fare clic su un pulsante per farlo. Qualcuno potrebbe dirmi come lo faccio?Stampa un ReportViewer senza anteprima

Ho provato reportviewer1.print e PrintDocument dalla casella degli strumenti. Ma non so come usarli correttamente.

Grazie dell'attenzione!

+0

E 'questo utilizzando CrystalReports? Questo è l'unico Report Viewer che conosco, ma ciò non significa che sia l'unico. – Bobson

+0

No, il suo ReportViewer (solo 'Report' dal ToolBox) Potresti fare un tentativo e dirmi come fare? Forse non è così diverso =) –

risposta

0

Ecco come lo facciamo con Crystal Reports.

  ReportDocument rd = new ReportDocument(); 
      // Insert code to run the report here 

      // This gets the user's default printer to print to. 
      PrintDialog prt = new PrintDialog(); 
      rd.PrintOptions.PrinterName = prt.PrinterSettings.PrinterName; 
      // This does the printing. 
      rd.PrintToPrinter(copies, true, 1, 1000); 

penso che l'equivalente di PrintOptions.PrinterName per voi sarebbe ReportViewer.PrinterSettings, ma ho il sospetto che cosa si ha realmente bisogno è l'equivalente di PrintToPrinter(), che non vedo nella mia breve sguardo.

+0

Davvero grazie per avermi risposto Bobson =) Ci proverò ora, non voglio che PrintDialog venga stampato automaticamente, proverò ora e daremo un feedback il prima possibile. Non ho il "ReportDocument"; s solo ReportDataSource che non ha .options su 'print'; s –

+0

@alannaidon - Per te, sarebbe 'ReportViewer' invece di' ReportDocument', ma l'idea sarebbe la stessa . Se non funziona, prova la mia altra risposta. Sospetto che sia più accurato per il tuo problema. – Bobson

1

Se la risposta Crystal Report non funziona, provare anche a this page. Ancora una volta, non l'ho testato, e non posso essere sicuro che funzioni, ma sembra un approccio completamente diverso che potrebbe funzionare. In caso contrario, sfortunatamente non avrò alcun aiuto.

+0

Ok Bobson. Ho provato qualcosa con SendKey, KeyPressing al pulsante "Stampa" che viene creato automaticamente con ReportViewer. Ne sai qualcosa? –

+0

@alannaidon - Non penso di aver mai usato SendKey. Sembra una bella soluzione semplice, però. Sentiti libero di aggiungerlo come una nuova risposta e accettarlo se lo fai funzionare. – Bobson

+0

Il link fornito qui funziona molto bene ed è completamente racchiuso in una classe in modo da non dover aggiungere alcun metodo al codice, solo una chiamata a questa classe. – MrWuf

7

Ho avuto lo stesso problema questo è il codice che uso e funziona come un fascino!

using System; 
using System.IO; 
using System.Text; 
using System.Globalization; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Drawing.Printing; 
using Microsoft.Reporting.WinForms; 
using System.Collections.Generic; 
using System.Collections.Specialized; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Data; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 


namespace NewLabelPrinter 
{ 
/// <summary> 
/// The ReportPrintDocument will print all of the pages of a ServerReport or LocalReport. 
/// The pages are rendered when the print document is constructed. Once constructed, 
/// call Print() on this class to begin printing. 
/// </summary> 
class AutoPrintCls : PrintDocument 
{ 
    private PageSettings m_pageSettings; 
    private int m_currentPage; 
    private List<Stream> m_pages = new List<Stream>(); 

    public AutoPrintCls(ServerReport serverReport) 
     : this((Report)serverReport) 
    { 
     RenderAllServerReportPages(serverReport); 
    } 

    public AutoPrintCls(LocalReport localReport) 
     : this((Report)localReport) 
    { 
     RenderAllLocalReportPages(localReport); 
    } 

    private AutoPrintCls(Report report) 
    { 
     // Set the page settings to the default defined in the report 
     ReportPageSettings reportPageSettings = report.GetDefaultPageSettings(); 

     // The page settings object will use the default printer unless 
     // PageSettings.PrinterSettings is changed. This assumes there 
     // is a default printer. 
     m_pageSettings = new PageSettings(); 
     m_pageSettings.PaperSize = reportPageSettings.PaperSize; 
     m_pageSettings.Margins = reportPageSettings.Margins; 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 

     if (disposing) 
     { 
      foreach (Stream s in m_pages) 
      { 
       s.Dispose(); 
      } 

      m_pages.Clear(); 
     } 
    } 

    protected override void OnBeginPrint(PrintEventArgs e) 
    { 
     base.OnBeginPrint(e); 

     m_currentPage = 0; 
    } 

    protected override void OnPrintPage(PrintPageEventArgs e) 
    { 
     base.OnPrintPage(e); 

     Stream pageToPrint = m_pages[m_currentPage]; 
     pageToPrint.Position = 0; 

     // Load each page into a Metafile to draw it. 
     using (Metafile pageMetaFile = new Metafile(pageToPrint)) 
     { 
      Rectangle adjustedRect = new Rectangle(
        e.PageBounds.Left - (int)e.PageSettings.HardMarginX, 
        e.PageBounds.Top - (int)e.PageSettings.HardMarginY, 
        e.PageBounds.Width, 
        e.PageBounds.Height); 

      // Draw a white background for the report 
      e.Graphics.FillRectangle(Brushes.White, adjustedRect); 

      // Draw the report content 
      e.Graphics.DrawImage(pageMetaFile, adjustedRect); 

      // Prepare for next page. Make sure we haven't hit the end. 
      m_currentPage++; 
      e.HasMorePages = m_currentPage < m_pages.Count; 
     } 
    } 

    protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e) 
    { 
     e.PageSettings = (PageSettings)m_pageSettings.Clone(); 
    } 

    private void RenderAllServerReportPages(ServerReport serverReport) 
    { 
     try 
     { 
      string deviceInfo = CreateEMFDeviceInfo(); 

      // Generating Image renderer pages one at a time can be expensive. In order 
      // to generate page 2, the server would need to recalculate page 1 and throw it 
      // away. Using PersistStreams causes the server to generate all the pages in 
      // the background but return as soon as page 1 is complete. 
      NameValueCollection firstPageParameters = new NameValueCollection(); 
      firstPageParameters.Add("rs:PersistStreams", "True"); 

      // GetNextStream returns the next page in the sequence from the background process 
      // started by PersistStreams. 
      NameValueCollection nonFirstPageParameters = new NameValueCollection(); 
      nonFirstPageParameters.Add("rs:GetNextStream", "True"); 

      string mimeType; 
      string fileExtension; 


      Stream pageStream = serverReport.Render("IMAGE", deviceInfo, firstPageParameters, out mimeType, out fileExtension); 



      // The server returns an empty stream when moving beyond the last page. 
      while (pageStream.Length > 0) 
      { 
       m_pages.Add(pageStream); 

       pageStream = serverReport.Render("IMAGE", deviceInfo, nonFirstPageParameters, out mimeType, out fileExtension); 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("possible missing information :: " + e); 
     } 
    } 

    private void RenderAllLocalReportPages(LocalReport localReport) 
    { 
     try 
     { 
      string deviceInfo = CreateEMFDeviceInfo(); 

      Warning[] warnings; 

      localReport.Render("IMAGE", deviceInfo, LocalReportCreateStreamCallback, out warnings); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("error :: " + e); 
     } 
    } 

    private Stream LocalReportCreateStreamCallback(
     string name, 
     string extension, 
     Encoding encoding, 
     string mimeType, 
     bool willSeek) 
    { 
     MemoryStream stream = new MemoryStream(); 
     m_pages.Add(stream); 

     return stream; 
    } 

    private string CreateEMFDeviceInfo() 
    { 
     PaperSize paperSize = m_pageSettings.PaperSize; 
     Margins margins = m_pageSettings.Margins; 

     // The device info string defines the page range to print as well as the size of the page. 
     // A start and end page of 0 means generate all pages. 
     return string.Format(
      CultureInfo.InvariantCulture, 
      "<DeviceInfo><OutputFormat>emf</OutputFormat><StartPage>0</StartPage><EndPage>0</EndPage><MarginTop>{0}</MarginTop><MarginLeft>{1}</MarginLeft><MarginRight>{2}</MarginRight><MarginBottom>{3}</MarginBottom><PageHeight>{4}</PageHeight><PageWidth>{5}</PageWidth></DeviceInfo>", 
      ToInches(margins.Top), 
      ToInches(margins.Left), 
      ToInches(margins.Right), 
      ToInches(margins.Bottom), 
      ToInches(paperSize.Height), 
      ToInches(paperSize.Width)); 
    } 

    private static string ToInches(int hundrethsOfInch) 
    { 
     double inches = hundrethsOfInch/100.0; 
     return inches.ToString(CultureInfo.InvariantCulture) + "in"; 
    } 
} 

}

Questa classe è il set up perfetto per quello che ti serve, allora tutto quello che dovete fare è:

private void AutoPrint() 
    { 
     AutoPrintCls autoprintme = new AutoPrintCls(reportViewer1.LocalReport); 
     autoprintme.Print(); 
    } 

e oplà la stampa. Collega questo a un metodo nel tuo codice (magari dopo il caricamento del report.) E la tua configurazione piacevolmente!

opzione: (non testato)

Come notato questo viene stampato alla stampante predefinita, di cambiare la stampante che si può fare come segue:

if (printDialog.ShowDialog() == DialogResult.OK) 
{ 
    m_pageSettings .PrinterSettings.PrinterName = printDialog.PrinterSettings.PrinterName; 
} 

non testati anche se, come ho più alcun codice sorgente per verificare questo

+0

Ciao, è possibile scegliere la stampante nel tuo codice da printdialog? – Kate

+0

sì, credo che usare printdialog soddisfi le tue necessità, dai un'occhiata http://msdn.microsoft.com/en-us/library/cfkddyc2(v=vs.110).aspx – lemunk

+0

Sì, ma non so come potrei date printdialog al vostro codice ... Provo m_pageSettings.PrinterSettings.PrinterName = PrintDialog1.PrinterSettings.PrinterName; ... ma ancora stampante predefinita ... – Kate

Problemi correlati