【问题标题】:Why am I getting a "Index was outside the bounds of the array" error when loading a Crystal Report?为什么加载 Crystal Report 时出现“索引超出数组范围”错误?
【发布时间】:2011-12-19 17:44:06
【问题描述】:

我使用下面的代码来设置水晶报表和显示的报表来源。我在项目中添加了一个数据集,并向该数据集添加了一个数据表。 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;
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    您需要检查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){
    
    }
    

    【讨论】:

    • 请原谅我的无知,但我是否必须添加 using 指令才能使用 Ds.Tables.Length 属性?它说我缺少参考。
    • 不,应该使用Count 而不是Length
    • 所以您使用的是System.Data.DataSet 对吗?如果是这样,那么Ds.Tables.Count 不应该需要任何其他 using 指令。我仔细检查了一个示例,没有任何问题。
    • 不不,我的意思是,Ds.Tables.Count 有效,但在加载表单时我仍然收到“索引超出数组范围”错误,就像以前一样。
    • 那是哪一行失败了?
    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 2015-09-12
    • 2017-12-02
    • 2020-09-04
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多