5
votes

I wrote this code to print a Crystal report.. but I got error

'missing parameters'...

ReportDocument rdoc = new ReportDocument();
rdoc .Load (Application.StartupPath +"\\"+@"REPORTS\SalaryReport.rpt");

rdoc.SetDataSource(ds.Tables[0]);

ParameterFields pfs = new ParameterFields();

ParameterField pfv = new ParameterField();
ParameterDiscreteValue pdv1 = new ParameterDiscreteValue();
pfv.Name = "fd";
pdv1.Value = fd;
pfv.CurrentValues.Add(pdv1);
pfs.Add(pfv);

ParameterField pfv1 = new ParameterField();
ParameterDiscreteValue pdv11 = new ParameterDiscreteValue();
pfv1.Name = "td";
pdv11.Value = td;
pfv1.CurrentValues.Add(pdv11);
pfs.Add(pfv1);

ParameterField pfv2 = new ParameterField();
ParameterDiscreteValue pdv12 = new ParameterDiscreteValue();
pfv2.Name = "department";
pdv12.Value = Dept;
pfv2.CurrentValues.Add(pdv12);
pfs.Add(pfv2);
crystalReportViewer1.ParameterFieldInfo = pfs;
crystalReportViewer1.ReportSource = rdoc;

PrinterSettings getprinterName = new PrinterSettings();
rdoc.PrintOptions.PrinterName = getprinterName.PrinterName;
rdoc.PrintToPrinter(1, true, 1, 1);

So help to solve this issue....how to print directly without going through Crystal Reports Viewer?

7

7 Answers

2
votes

So Simple

  1. Remove thes lines:

    crystalReportViewer1.ReportSource = objRpt;
    crystalReportViewer1.Refresh();
    
  2. Add this line:

    objRpt.PrintToPrinter(1, false, 0, 0);
    
1
votes

Printing directly to the printer is not going to solve your problem. The Crystal Report requires parameters to be set correctly and they're not for some reason.

0
votes
reportname report1=new reportname(); 
report1.PrintOptions.PaperOrientation = PaperOrientation.Portrait;
report1.PrintOptions.PaperSize = PaperSize.PaperA4;
report1.PrintToPrinter(1, false, 0, 15);

use these codes with function(Parameters)

0
votes
  List<BusLib.Report.ReportParameter> ParaList = new List<BusLib.Report.ReportParameter>();
            ParaList.Add(new BusLib.Report.ReportParameter("Para1", Value1));
            ParaList.Add(new BusLib.Report.ReportParameter("Para2", Value2));
            ParaList.Add(new BusLib.Report.ReportParameter("Para3", Value3));
            ParaList.Add(new BusLib.Report.ReportParameter("Para4", Value4));

After That..

public void SetParameters(List<BusLib.Report.ReportParameter> pParams)
    {
        if (pParams == null) { return; }
        try
        {
            foreach (BusLib.Report.ReportParameter pPara in pParams)
            {
                CReport.SetParameterValue(pPara.ParameterName, pPara.ParameterValue);
            }
        }
        catch (Exception Ex)
        {
            Val.Message(Ex.Message.ToString());
        }
    }

you should try this ... you will get definetly success...

0
votes
private void PrintReport(string reportPath, string PrinterName)
{
    CrystalDecisions.CrystalReports.Engine.ReportDocument rptDoc =
                        new CrystalDecisions.CrystalReports.Engine.ReportDocument();
    rptDoc.Load(reportPath);

    CrystalDecisions.Shared.PageMargins objPageMargins;
    objPageMargins = rptDoc.PrintOptions.PageMargins;
    objPageMargins.bottomMargin = 100;
    objPageMargins.leftMargin = 100;
    objPageMargins.rightMargin = 100;
    objPageMargins.topMargin = 100;
    rptDoc.PrintOptions.ApplyPageMargins(objPageMargins);
    //rptDoc.PrintOptions.PrinterName = PrinterName;
    rptDoc.PrintToPrinter(1, false, 0, 0);
}

private void PrintToPrinter()
{
    PrintReport(System.Windows.Forms.Application.StartupPath +"\\VCrpfrmprint.rpt","Send To OneNote 2010");
}

rptDoc.PrintToPrinter method prints the specified pages of the report to the printer selected with the help of the PrintOptions.PrinterName property.
If no printer is selected, the default printer specified in the report will be used.

We are using PrintToPrinter method as :

public void PrintToPrinter (int nCopies , boolean collated , int startPage , int endPage );

where:

  • nCopies indicates the number of copies to print.
  • collated indicates whether to collate the pages.
  • startPage indicates the first page to print.
  • endPage indicates the last page to print.
0
votes
 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (MessageBox.Show("Do you want to Print/View P.O? Please be patient as P.O may take few seconds to load.", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                pl.POId = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
                DataTable dt = new DataTable();
                dt = bl.PurchaseOrderPrint(pl);
                if (dt.Rows.Count > 0)
                {
                    Reports.PuchaseOrder rpt = new Reports.PuchaseOrder();
                    Print f = new Print();
                    rpt.SetDataSource(dt);
                    f.CRV.ReportSource = rpt;
                    f.Show();
                }
            }
            else
            {
                return;
            }
        }