1

C# コードから CrystalReport レポートに値を渡そうとしています。

編集

private void PrintOrder(List<OrderPrintBO> pListOrderBO)
        {
            DSOrderReport oDSOrderReport = new DSOrderReport();
            DataTable oDataTable = oDSOrderReport.Tables[0];
            String sOrderNo = "";

            if (pListOrderBO.Count > 0)
            {
                for (int i = 0; i < pListOrderBO.Count; i++)
                {
                    DataRow oRow = oDataTable.NewRow();
                    oRow["OrderID"] = pListOrderBO[i].OrderID;
                    oRow["OrderNumber"] = pListOrderBO[i].OrderNumber;
                    sOrderNo = pListOrderBO[i].OrderNumber;
                    oDataTable.Rows.Add(oRow);
                }
            }

            oDSOrderReport.Merge(oDataTable);
            oDSOrderReport.AcceptChanges();

            if (oDSOrderReport.Tables[0].Rows.Count > 0)
            {
                // Main Copy
                PrintDialog printDialog = new PrintDialog();
                rptOrder oMainOrder = new rptOrder();

                String sCompanyName = System.Configuration.ConfigurationManager.AppSettings["CompanyName"].ToString();
                String sPhone1 = System.Configuration.ConfigurationManager.AppSettings["Phone1"].ToString();
                String sPhone2 = System.Configuration.ConfigurationManager.AppSettings["Phone2"].ToString();
                String sShowOrderNo = System.Configuration.ConfigurationManager.AppSettings["ShowOrderNo"].ToString();

                ((CrystalDecisions.CrystalReports.Engine.TextObject)oMainOrder.ReportDefinition.ReportObjects["txtCompanyName"]).Text = sCompanyName;
                ((CrystalDecisions.CrystalReports.Engine.TextObject)oMainOrder.ReportDefinition.ReportObjects["txtPhone1"]).Text = "Tel:" + sPhone1;
                ((CrystalDecisions.CrystalReports.Engine.TextObject)oMainOrder.ReportDefinition.ReportObjects["txtPhone2"]).Text = "Tel:" + sPhone2;

////このコメントアウトされたセクションは例外を与えます

 //string sVarOrderNo = "";

            //if (sShowOrderNo.ToLower() == "yes")
            //{
            //    sVarOrderNo = sOrderNo;
            //}


            //((CrystalDecisions.CrystalReports.Engine.TextObject)oMainOrder.ReportDefinition.ReportObjects["txtOrderNo"]).Text = "O.N. : " + sVarOrderNo;

                oMainOrder.SetDataSource(oDSOrderReport);

                oMainOrder.PrintOptions.PrinterName = printDialog.PrinterSettings.PrinterName;


    try
                    {
                        oMainOrder.PrintToPrinter(1, false, 0, 0);
 MessageBox.Show("Order Printed Successfully", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message.ToString());
                    }
                }
                else
                {
                    MessageBox.Show("Error in Printing Order", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

編集を終了

最初の 3 つのテキスト ボックス (CompanyName、Phone1、Phone2) では、すべて正常に機能していましたが、OrderNo をレポートに渡そうとすると、Index が配列の範囲外にありました。レポートにtxtOrderNoという名前の TextBox オブジェクトがある場合でも、例外が発生します

なぜこれが起こっているのかわかりません。助けてください。ありがとう。

4

1 に答える 1

0

sOrderNo関連するコードを変更してみてください。

string sVarOrderNo = "";

if (sShowOrderNo.ToLower() == "yes")
{
     sVarOrderNo =  sOrderNo;
}


((CrystalDecisions.CrystalReports.Engine.TextObject)oMainOrder.ReportDefinition.ReportObjects["txtOrderNo"]).Text = "O.N. : " + sVarOrderNo;

アップデート

あなたの問題は以下のコードスニペットです。あなたの中でfor loopあなたはに値を割り当てようとしていますsOrderNo。これは無意味です。B'cosはループが発生するたびにオーバーライドします。では、これの目的は何ですか?この値が必要な場合は、この値をテーブルの行として、またはレポートのパラメーターとして使用する必要があります。

if (pListOrderBO.Count > 0)
            {
                for (int i = 0; i < pListOrderBO.Count; i++)
                {
                    DataRow oRow = oDataTable.NewRow();
                    oRow["OrderID"] = pListOrderBO[i].OrderID;
                    oRow["OrderNumber"] = pListOrderBO[i].OrderNumber;
                    sOrderNo = pListOrderBO[i].OrderNumber;
                    oDataTable.Rows.Add(oRow);
                }
            }

これがお役に立てば幸いです。

于 2013-01-27T07:56:26.857 に答える