索引超出范围,错误

时间:2014-07-16 10:08:06

标签: asp.net c#-4.0

我的代码有时会抛出错误,但有时却不会。

错误: 指数超出范围。

代码:

 protected void btnGenerateReport_Click(object sender, EventArgs e)
    {
        GridViewSmsComplaints.DataBind();

        dtRoom.Columns.Add(new DataColumn("ID", typeof(string)));
        dtRoom.Columns.Add(new DataColumn("RecievingDate", typeof(string)));
        dtRoom.Columns.Add(new DataColumn("FromMobileNo", typeof(string)));
        dtRoom.Columns.Add(new DataColumn("Message", typeof(string)));
        dtRoom.Columns.Add(new DataColumn("IsComplaint", typeof(short)));

        for (int i = 0; i <= 5; i++)
        {
            int ID = Convert.ToInt32(GridViewSmsComplaints.Rows[i].Cells[0].Text);
            ManageRecievedMessage mngRecMsg = new ManageRecievedMessage();
            DropDownList IsValid = (DropDownList) GridViewSmsComplaints.Rows[i].FindControl("ddlValidity");
            short IsComplaint;

            if (IsValid.SelectedValue == "1")
            {
                IsComplaint= Convert.ToInt16(IsValid.SelectedValue.ToString());
                mngRecMsg.UpdateSmsComplaintValidity(ID, 1);

                DataRow datarw = null;
                datarw = dtRoom.NewRow();

                    datarw[0] = GridViewSmsComplaints.Rows[i].Cells[0].Text;
                    datarw[1] = GridViewSmsComplaints.Rows[i].Cells[1].Text;
                    datarw[2] = GridViewSmsComplaints.Rows[i].Cells[2].Text;
                    datarw[3] = GridViewSmsComplaints.Rows[i].Cells[3].Text;
                    datarw[4] = IsComplaint; //Convert.ToInt16(GridViewSmsComplaints.Rows[i].Cells[4].Text);

                dtRoom.Rows.Add(datarw);
            }
            else if(IsValid.SelectedValue != "1" )
            {       
                    IsComplaint= Convert.ToInt16(IsValid.SelectedValue.ToString());
                    mngRecMsg.UpdateSmsComplaintValidity(ID, IsComplaint);
            }
        }

        GridViewSmsComplaints.DataBind();

        ReportViewer1.ProcessingMode = ProcessingMode.Local;
        ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/Report_SmsComplaintsByDate.rdlc");

        if (dtRoom.Rows.Count <= 0)
        {
            HiddenFieldSetMessage.Value = "NotExists";
            HiddenFieldShowMessage.Value = "True";
            ReportViewer1.Visible = false;
            GridViewSmsComplaints.DataBind();
            GridViewSmsComplaints.Visible = false;
        }
        else
        {
            ReportDataSource rpds = new ReportDataSource("DataSet1", dtRoom);
            ReportViewer1.LocalReport.DataSources.Clear();
            ReportViewer1.LocalReport.DataSources.Add(rpds);
            ReportViewer1.Visible = true;
            GridViewSmsComplaints.DataBind();
            GridViewSmsComplaints.Visible = false;
        }
    }

在这一行:

int ID = Convert.ToInt32(GridViewSmsComplaints.Rows[i].Cells[0].Text);

我的gridview显示两行,其中我必须验证来自下拉列表的VALID(1)或无效(0)但是它会抛出错误但有时它不会。

ERROR:

Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"}

1 个答案:

答案 0 :(得分:2)

您的网格并不总是至少 5行,因此尝试索引Rows集合会导致您的越界异常。对我来说有点奇怪,你目前正在准确地排除5行,但如果你得到这个错误,情况并非如此。

为避免错误,请将代码更改为:

for (int i = 0; i < GridViewSmsComplaints.Rows.Count; i++)
{
    int ID = Convert.ToInt32(GridViewSmsComplaints.Rows[i].Cells[0].Text);
    ....