2012-10-04 6 views
6

Visual Studio 2010 C# Windows Forms 응용 프로그램 + MySql을 사용 중입니다. 보고서 뷰어가 100 % 작동합니다. 보고서 뷰어는 내 데이터베이스의 데이터로 채워져 있습니다. 인쇄 버튼을 클릭하면 인쇄됩니다 ... 그러나 클라이언트는이 버튼을 클릭하지 않으려 고 자동으로 인쇄하려고합니다. ReportViewer를 호출하면 단추를 클릭 할 필요없이 보고서 자체로 인쇄됩니다. 아무도 내가 어떻게하는지 말해 줄 수 없을까?미리보기없이 ReportViewer 인쇄

도구 상자에서 reportviewer1.print 및 PrintDocument를 테스트했습니다. 그러나 나는 이것을 올바르게 사용하는 방법을 모른다.

감사합니다.

+0

CrystalReports를 사용하고 있습니까? 그것은 내가 아는 유일한 보고서 뷰어이지만, 이것이 유일한 보고서 뷰어입니다. – Bobson

+0

아니요, ReportViewer (툴박스의 '보고서'만 사용) 샷을주고이를 수행하는 방법을 알려주시겠습니까? 아마도 그다지 다르지는 않음 =) –

답변

0

이것은 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); 

나는 당신을 위해 PrintOptions.PrinterName에 상응하는 ReportViewer.PrinterSettings하다고 생각,하지만 난 당신이 정말 필요로하는 것은 내 간단히 살펴에 표시되지 않습니다 PrintToPrinter()에 해당하는, 의심.

+0

내게 대답 해 주셔서 대단히 감사합니다. Bobson =) 지금 시도해 보겠습니다. PrintDialog가 자동으로 인쇄되기를 원하지 않습니다. 가능한 한 빨리 피드백을 보내 드리겠습니다. "ReportDocument"가 없으며 'print'에 대한 옵션이없는 ReportDataSource 만 있습니다. –

+0

@alannaidon - 당신에게'ReportDocument' 대신'ReportViewer'가 될 것이지만 아이디어는 같을 것입니다 . 작동하지 않으면 다른 대답을 시도하십시오. 나는 그것이 귀하의 문제에 대해 더 정확한 것으로 의심합니다. – Bobson

1

Crystal Reports 응답이 효과적이지 않은 경우 this page을 시도해 볼 수도 있습니다. 다시 말하지만, 나는 그것을 테스트하지 않았고, 그것이 작동 하는지를 확신 할 수는 없지만, 작동 할 수있는 전혀 다른 접근법처럼 보입니다. 그렇지 않다면 불행히도 도움이되지 않을 것입니다.

+0

그건 Ok Bobson입니다. SendKey를 사용하여 무언가를 시도했습니다. KeyView를 사용하여 ReportViewer에서 자동으로 생성 된 "인쇄"버튼을 누르십시오. 그것에 대해 아는 것이 있습니까? –

+0

@alannaidon - 나는 SendKey를 사용한 적이 없다고 생각합니다. 그것은 좋은 간단한 솔루션처럼 들리지만. 언제든지 새로운 대답으로 추가하고 동의하십시오. – Bobson

+0

여기에 제공된 링크는 매우 잘 작동하며 클래스에 완전히 포함되어 있으므로이 클래스에 대한 호출만으로 코드에 메서드를 추가 할 필요가 없습니다. – MrWuf

7

나는이 코드가 내가 사용하는 코드이며 매력처럼 작동합니다.

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"; 
    } 
} 

}

이 클래스는 당신이 할 필요가 다음 필요에 대한 완벽한 설정 한 :

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

와 헤이 프레스토는 인쇄합니다. 이 코드를 A 코드의 메소드에 첨부하십시오.

옵션 : (테스트하지)

으로이 기본 프린터로 인쇄합니다 발견

가 프린터를 변경하려면 다음 작업을 수행 할 수 있습니다 :

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

내가 더 이상이 없기 때문에 비록 테스트하지를 이것을 테스트 할 소스 코드

+0

안녕하세요, printdialog에서 코드에서 프린터를 선택할 수 있습니까? – Kate

+0

네, printdialog를 사용하는 것이 당신의 필요에 맞을 것이라고 생각합니다. http://msdn.microsoft.com/en-us/library/cfkddyc2(v=vs.110).aspx – lemunk

+0

네,하지만 어떻게 될지 모르겠습니다. 귀하의 코드 printdialog 줄 ... 나는 m_pageSettings.PrinterSettings.PrinterName 시도 = PrintDialog1.PrinterSettings.PrinterName; ...하지만 여전히 기본 프린터 ... – Kate