Почему при загрузке Crystal Report появляется ошибка «Индекс вышел за границы массива»? - PullRequest
0 голосов
/ 19 декабря 2011

Я использую код ниже, чтобы установить источник отчета Crystal Report & Display. Я добавил DataSet в проект и добавил DataTable в этот DataSet. DataTable называется «my_dt», а DataSet называется «MyDataSet». Таблица данных my_dt имеет ровно 3 столбца, соответствующих таблице «Посещаемость» в моей базе данных. Когда я нажимаю «Начать отладку», я не получаю сообщение об ошибке, и отображается пустой отчет. Когда я нажимаю «Пуск без отладки», я получаю эту ошибку. Я не знаю, что я делаю неправильно. Пожалуйста, помогите мне, любая помощь будет принята с благодарностью.

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 Ответ

3 голосов
/ 19 декабря 2011

Вам необходимо проверить, есть ли у 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){

}
...