尝试将值传递给水晶报表文本框对象时发生异常



我正在尝试将值从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;
                }

结束编辑

对于前三个文本框(CompanyName、Phone1 和 Phone2),每个操作都很好,但是当我尝试将 OrderNo 传递给报表时,Index 超出了数组的范围。 发生异常,即使我的报表具有名为 txtOrderNo 的文本框对象

我不确定为什么会发生这种情况。请帮忙。谢谢。

尝试更改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);
                }
            }

我希望这对你有帮助。

最新更新