为什么在加载Crystal报表时出现“索引超出数组范围”错误?

时间:2011-12-19 17:44:07

标签: c# visual-studio-2010 crystal-reports

我使用下面的代码设置水晶报告的报告来源&显示。我在项目中添加了一个DataSet&向该DataSet添加了一个DataTable。 DataTable名为“my_dt”& DataSet名为“MyDataSet”。 “my_dt”DataTable正好有3列与我的数据库中的“出勤”表相匹配。当我按“开始调试”时,我没有收到错误&它显示一个空白报告。当我按下“Start Without Debugging”时,我得到了这个错误。我不知道我做错了什么。请帮助我,非常感谢任何帮助。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;

namespace CrystalReportWithAccess
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            my_rpt objRpt;
            // Creating object of our report.
            objRpt = new my_rpt();

            String ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\CentreDB.mdb;Jet OLEDB:Database Password=pass";

            OleDbConnection myConnection = new OleDbConnection(ConnStr);

            String Query1 = "SELECT * FROM [Attendance]";

            OleDbDataAdapter adapter = new OleDbDataAdapter(Query1, ConnStr);

            DataSet Ds = new DataSet();

            // here my_dt is the name of the DataTable which we 
            // created in the designer view.
            adapter.Fill(Ds, "my_dt");

            if (Ds.Tables[0].Rows.Count == 0)
            {
                MessageBox.Show("No data Found", "CrystalReportWithAccess");
                return;
            }

            // Setting data source of our report object
            objRpt.SetDataSource(Ds);

            CrystalDecisions.CrystalReports.Engine.TextObject root;
            root = (CrystalDecisions.CrystalReports.Engine.TextObject)
                 objRpt.ReportDefinition.ReportObjects["txt_header"];
            root.Text = "Sample Report By Using Data Table!!";

            // Binding the crystalReportViewer with our report object. 
            crystalReportViewer1.ReportSource = objRpt;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您需要检查Ds.Tables object是否包含以下任何元素:

Ds.Tables.Count > 0

在你的例子中使用它:

if (Ds.Tables.Count > 0 && Ds.Tables[0].Rows.Count == 0)
{
    MessageBox.Show("No data Found", "CrystalReportWithAccess");
    return;
}

尝试检查ReportObjects是否包含任何内容。

if(objRpt.ReportDefinition.ReportObjects.Count > 0){

}