DataGridView行错误索引超出范围c#

时间:2016-11-16 06:25:16

标签: c# sql-server winforms datagridview indexoutofrangeexception

我正在使用C#WinForms,我有一些复选框,其文本在按钮单击时添加到datagridview(dgData)中。这是它的代码。

private void btnAdd_Click(object sender, EventArgs e)
    {
        dgData.Rows.Clear();
        foreach(Control c in pnlDeficiency.Controls)
        {
            if ((c is CheckBox) && ((CheckBox)c).Checked)
            dgData.Rows.Add(c.Text);
        }
    }

我的保存代码就在这里。

private void btnSave_Click(object sender, EventArgs e)
    {
        if (MessageBox.Show("Are You Sure You Want to Save the Record!", "TAC | Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
        {
            SqlConnection S_Conn = new SqlConnection(strConnString);
            S_Conn.Open();
            int a = 10;
            for (int i = 0; i <= dgData.Rows.Count; i++)
            {
                string Query_Insert = "";
                Query_Insert = "INSERT into Deficiency_Details (Vendor_Id, Tender_Id, DeficiencyType) values ('" + cmbSelectVendor.SelectedValue + "', '" + cmbSelectTender.SelectedValue + "', '" + dgData.Rows[i].Cells[0].Value.ToString() + "')";
                SqlCommand Command_Insert = new SqlCommand(Query_Insert, S_Conn);
                a = Command_Insert.ExecuteNonQuery();
            }
            if (a == 0)
            {
                MessageBox.Show("Record Not Saved Successfully! Please Check Fields", "TAC | Alert", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show("Record Saved Successfully", "TAC | Success", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
            }
            S_Conn.Close();
            S_Conn.Dispose();
            ResetAll();
        }
    }

我得到的错误是指数偏离狂暴。我调试了我的程序,错误就在这行

dgData.Rows[i].Cells[0].Value.ToString()

VALUE为NULL。我知道错误,我之前解决了很多次,但这一次它根本没有解决。请帮帮我。

2 个答案:

答案 0 :(得分:1)

问题是这一行:

for (int i = 0; i < dgData.Rows.Count; i++)

您需要将其更改为:

{{1}}

因为我们假设你的GridView中有10行。 dgData.Rows.Count为10.现在,由于你的&lt; =运算符,你从0到10运行。 0-10将是11次循环运行。您的GridView只包含10行。因此,索引在最后一次循环迭代时超出范围。如果你改为&lt;运算符你的循环刚刚从0到9运行,正好是10次迭代。

答案 1 :(得分:0)

使用以下代码,您可以在其中指定需要插入的单元格的索引

DataGridViewRow row = (DataGridViewRow)dgData.Rows[0].Clone();
row.Cells[0].Value = c.text;
dbData.Rows.Add(row);