2015-04-07 15 views
5

SQL Server'da saklı yordamları kullanarak Crystal Report'da veri yerleştiriyorum. CR'deki formülü kullanarak her sütunu geçiren ve biçimlendiren parametreleri kullanarak istediğim baskı çıktısını elde edebildim.Kristal Raporu Doğrudan ASP.NET'te Yazdır C#

Raporlamada, olağan süreç, Crystal Report Viewer'da oluşturulan/oluşturulan çıktıyı önizleme olacak, daha sonra, baskı işlevlerine devam etmek için ilk önce raporu PDF'ye dönüştürecek olan yazdırma, verme seçenekleri var

İstediğim şey, yazdırma düğmesini tıkladığımda otomatik olarak yazdırma işlemlerine yol açacaktır.

ben cevap How to print crystal report directly to a client machine using C# Asp.net

using oReportDocument.PrintToPrinter(1,true,0,0); 

kod için bu bağlantıya kurşun oldu, ayrıca sayfa init veri kümesini doldurmak için düşündüren diğerleri, ama bunu nasıl yapılacağına ilişkin kayıp görünüyor ediyorum. .

Bu benim şu anda çalışan kod (o kristal rapor önizleme ilk götürecektir zamanki baskı işlemidir

public partial class Report_MonthlySalesReportPrint : System.Web.UI.Page 
{ 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 
    ReportDocument report = new ReportDocument(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     con.Open(); 

     //Parameters to be passed as needed in formulas in Report 
     string RP = Session["RP"].ToString(); 
     DateTime cms = Convert.ToDateTime(Session["CurrentMonthStart"].ToString()); 
     string Loc = Session["Location"].ToString(); 
     string MonthCurrent = Session["MonthCurrent"].ToString(); 
     string YearCurrent = Session["YearCurrent"].ToString(); 
     string MonthPrevious = Session["MonthPrevious"].ToString(); 
     string YearPrevious = Session["YearPrevious"].ToString(); 
     string MonthLastYear = Session["MonthLastYear"].ToString(); 
     string YearLastYear = Session["YearLastYear"].ToString(); 

     report.Load(Server.MapPath("MSRC.rpt")); 

     CrystalReportViewer1.ReportSource = report; 
     CrystalReportViewer1.ReuseParameterValuesOnRefresh = true; 
     CrystalReportViewer1.DataBind(); 

     report.SetParameterValue(0, MonthLastYear); 
     report.SetParameterValue(1, MonthCurrent); 
     report.SetParameterValue(2, MonthPrevious); 
     report.SetParameterValue(3, RP); 
     report.SetParameterValue(4, Loc); 
     report.SetParameterValue(5, cms); 
     report.SetParameterValue(6, YearCurrent); 
     report.SetParameterValue(7, YearPrevious); 
     report.SetParameterValue(8, YearLastYear); 

     report.PrintToPrinter(1, true, 0, 0); 
     con.Close(); 
    } 
} 

GÜNCELLEME: Sadece ihtiyaç duyulan

bu konuyu netleştirmek amacıyla güncellemek için bu kabul cevabı aşağıda sunucu tarafında sadece çalışacaktır. kullanıcı uzaktan sunucu eriştiğinde böyle, kod çalışmaz Anlamı.

cevap

2

1. çoğu kullanıcı kesinlikle olması sunucuyu uzaktan erişen şekilde bu Web tabanlı uygulamada baskıda en ideal yöntemdir

BASKI MÜŞTERİ-YAN.

Bu javascript kodunu, kristal rapor görüntüleyicinin bulunduğu .aspx sayfanızın baş etiketinin içine yerleştirin. Orada düğmeye take note - vücut etiketinde aynı sayfada birlikte

 <script type="text/javascript"> 


       function Print() { 
         var dvReport = document.getElementById("dvReport"); 
         var frame1 = dvReport.getElementsByTagName("iframe")[0]; 
         if (navigator.appName.indexOf("Internet Explorer") != -1) { 
          frame1.name = frame1.id; 
          window.frames[frame1.id].focus(); 
          window.frames[frame1.id].print(); 
         } 
         else { 
          var frameDoc = frame1.contentWindow ? frame1.contentWindow : frame1.contentDocument.document ? frame1.contentDocument.document : frame1.contentDocument; 
          frameDoc.print(); 
         } 
        } 
      </script> 

, bu

<body> 
     <form id="form1" runat="server"> 
     <asp:Button ID="btnPrint" runat="server" Text="Print Directly" OnClientClick="Print()"></asp:Button> 

      <div id="dvReport"> 
      <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" ToolPanelView="None" EnableDatabaseLogonPrompt="false" /> 


      </div> 
     </form> 
    </body> 

koydu. kristal rapor görüntüleyiciyi içeren div dışında olmalıdır. Bu kesinlikle işe yarayacak. Bu yöntem üzerinde tam bir tartışma bakın: http://www.aspsnippets.com/Articles/Print-Crystal-Report-on-Client-Side-on-Button-Click-using-JavaScript-in-ASPNet.aspx


2. SUNUCU YAN burada

en önerilen cevapları baskısı printToPrinter() Fonksiyonu olduğunu.Bu yöntem, sunucu tarafında yapılır, dolayısıyla istemci, sunucu sunucusuyla eşleştirilemez veya erişemezse, Web tabanlı uygulamanızın/web sitenizin sunucusuna uzaktan eriştiğinizde sınırlanır.


ileri bilgi için bu okuyunuz: http://aspalliance.com/509_Automatically_Printing_Crystal_Reports_in_ASPNET.3

2
 using System.Drawing.Printing; 
     using Crystal Decisions.CrystalReports.Engine; 
     using Crystal Decisions.Shared; 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     void(); 
     } 
     public void() 
     { 
     try 
     { 
     ReportDocument crystalReport = new ReportDocument(); 
     crystalReport.Load(Server.MapPath("~/CrystalReport2.rpt")); 
     DataSet dsCustomers = GetData("select * from visitor_details where id ='" + Session["sessionvid"] + "' and plant ='" + Session["sessionplant"] + "'"); 

     DataTable dataTable = dsCustomers.Tables[0]; crystalReport.Database.Tables["visitor_details"].SetDataSource((DataTable)dataTable); 
      CrystalReportViewer2.ReportSource = crystalReport; 
      CrystalReportViewer2.Zoom(100); 
      //crystalReportViewer1.ExportReport() ; 
      CrystalReportViewer2.RefreshReport(); 
      crystalReport.PrintOptions.PrinterName = GetDefaultPrinter(); 
      crystalReport.PrintToPrinter(1, false, 0, 0); 
     } 
     catch 
     { 
      Response.Write("<script LANGUAGE='JavaScript' >alert('connect printer settings')</script>"); 
     } 

}

+0

hi @balajibran, neredeyse ben gönderdiniz dayalı aynı kodlara sahip. Tek fark, veri kümesi ve datatable kullanmıyorum. CrystalReport.PrintToPrinter (1, false, 0, 0) koyarak önerinizi takip ettim; sadece mevcut kodumda, ama hiçbir şey değişmedi, hala kristal rapor görüntüleyicisine önizleme yapıyor. – rickyProgrammer

+0

iyi haber, bu zaten benim için çalıştı, bir süre önce doğru yazıcıya bağlı değildi tek sorun. Bununla birlikte, birkaç tane daha sorgum var. Bunu, bir yazıcı iletişim kutusunun hemen yazdırılmadan önce gösterileceği yerde nasıl ayarlayabilirim, yani kağıdın boyutunu ayarlamak ve genellikle yazdırmakta olan kullanıcıyı bilgilendirmek için buna ihtiyacım var. – rickyProgrammer

+0

Bunun için ben buna cevap verdim, ancak istediğim şey bir PRINT DIALOG'un mevcut bir yazıcıyı seçmesi için ilk önce çıkması gerektiğidir, çünkü kullandığımız kod sayesinde, raporu doğrudan ve hemen yazdırır. Daha esnek yazdırma seçenekleri için bir yazdırma iletişim kutusuna ihtiyacım var. Bunu nasıl yapabilirim? Teşekkürler – rickyProgrammer

2

Bu benim için çalışır. Gerekirse, kendi PageSettings kendi oluşturabilirsiniz, sadece bir emtpy kullanın.

Baskı iletişim kutusu açmak istiyorsanız, PrintDialog;

using System.Windows.Forms; 

//... 

ReportClass report = new ReportClass(); 
report.FileName = @"C:/Layout.rpt"; 
report.Load(); 
report.SetDataSource(YourSource); 

PrinterSettings settings = new PrinterSettings(); 

PrintDialog pdialog = new PrintDialog(); 
if (pdialog.ShowDialog() == DialogResult.OK) 
{ 
    settings = pdialog.PrinterSettings; 
} 

report.PrintToPrinter(settings, new PageSettings() { }, false); 
+0

Merhaba @DionV. printername üzerinde, gerçek tam yazıcı adını koymalı mıyım? Ayrıca, veri kaynağı adına, veri kümesi kullanmıyor ve veri kaynaklarım doğrudan saklı yordamdan geliyorsa ne yapmam gerekir? – rickyProgrammer

+0

@rickyProgrammer evet, tam printername. 'SetDataSource' yöntemi ayrıca 'DataTable' veya 'IEnumerable' kabul eder. Verileriniz Saklı Yordamdan geliyorsa, muhtemelen 'DataTable' elde edersiniz. –

+0

Ben zaten crystalReport.PrintToPrinter (1, false, 0, 0) kullanarak sorunu çözdüm; Sadece yukarıdaki koduma ekledim ve tam olarak sayfayı doğrudan basıyor, ancak istediğim yazıcıyı seçmek için ilk önce bir iletişim kutusu açılacak. – rickyProgrammer

0
  CrystalReportSaleSlip _CrystalReportSaleSlip = new CrystalReportSaleSlip(); 
      _CrystalReportSaleSlip.SetDataSource(dtReport); 

      _CrystalReportSaleSlip.PrintOptions.PrinterName = "Hp Laserjet M1522 MFP Series PCL 6"; 
      _CrystalReportSaleSlip.PrintToPrinter(1, false, 0, 0); 
      crystalReportViewer1.Refresh(); 
İlgili konular