web-dev-qa-db-ja.com

CrystalReportをASP.NETC#で直接印刷する

SQLServerストアドプロシージャを使用してCrystalReportにデータを入力しています。 CRの数式を使用して各列を渡し、フォーマットするパラメーターを使用して、目的の印刷出力を実現することができました。

レポートの印刷では、通常のプロセスは、作成/生成された出力をCrystal Report Viewerでプレビューし、次に、最初にレポートをPDFに変換して続行する、印刷、エクスポートのオプションがあります。印刷機能へ

印刷ボタンをクリックすると、自動的に印刷手順が表示されます。

私は答えのためにこのリンクに導かれました C#Asp.netを使用してクライアントマシンに直接クリスタルレポートを印刷する方法

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

コード、他の人もページの初期化でデータセットを埋めることを提案していますが、私はそれを行う方法に迷っているようです。

これは私の現在作業中のコードです(最初にCrystalReportプレビューに移動する通常の印刷プロセスです。

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();
    }
}

更新しました:

以下の承認された回答はサーバー側でのみ機能することを明確にするために、これを更新する必要がありました。つまり、ユーザーがサーバーにリモートでアクセスしている場合、コードは機能しません。

5
rickyProgrammer

1。クライアント側の印刷

ほとんどのユーザーは確実にサーバーにリモートでアクセスするため、これはWebベースのアプリケーションでの印刷に最も理想的な方法です。

このjavascriptコードを、Crystal ReportViewerが存在する.aspxページのheadタグ内に配置します。

     <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>

同じページで、bodyタグにこれを入れます

  <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>

-そこにあるボタンに注意してください。 Crystal ReportViewerを囲んでいるdivの外側にある必要があります。これは確かに機能します。この方法の詳細については、以下を参照してください。 http://www.aspsnippets.com/Articles/Print-Crystal-Report-on-Client-Side-on-Button-Click-using-JavaScript-in-ASPNet.aspx


2。サーバー側の印刷

ここで最も推奨される答えは、printToPrinter()関数です。この方法はサーバー側で行われるため、クライアントがサーバープリンターにマップしたりアクセスしたりできない限り、Webベースのアプリケーション/ Webサイトのサーバーにリモートでアクセスする場合は制限されます。


詳細については、こちらをお読みください: http://aspalliance.com/509_Automatically_Printing_Crystal_Reports_in_ASPNET.

2
rickyProgrammer
       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>");
        }

}

3
balajibran

これは私のために働きます。必要に応じて独自のPageSettingsを作成できます。それ以外の場合は、空の変数を使用します。

印刷ダイアログを開きたい場合は、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);
2
Dion V.
            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(); 
0
Anubhav rawat

PrintToPrinterは、プリンターがサーバーで構成されている場合にのみ機能します。クライアントからは、プリンタがリストされていない可能性があるため、これが機能しない可能性があります

0
Nebil Rasheed