错误消息"索引超出范围。必须是非负的且小于集合的大小"

时间:2016-06-06 10:59:56

标签: c# datagridview

我有这段代码:

string cs = "Data Source=IS020114\\CODRINMA;Initial Catalog=gcOnesti;Integrated Security=True";

    string select = "SELECT p.cod AS Numar, p.data AS Data, c.nume AS Furnizor, d.nume AS DocFurnizor, p.doc_cod AS NrDocFurnizor, p.validat AS Validat, p.facturat AS Contat, g.nume AS Gestiune FROM primar p INNER JOIN cf c ON p.part1=c.cf_id INNER JOIN gestiuni g ON p.part2 = g.gest_id INNER JOIN documente d ON p.doc_id = d.doc_id WHERE (p.tip = '2') ORDER BY p.Data";

    using (SqlConnection con = new SqlConnection(cs))
            {
                DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn();
                col.HeaderText = "Selecteaza";
                dataGridView1.Columns.Add(col);
                col.Width = 65;
                con.Open();
                SqlCommand cmd = new SqlCommand(select, con);
                SqlDataAdapter sda = new SqlDataAdapter();
                sda.SelectCommand = cmd;
                DataTable dt = new DataTable();
                sda.Fill(dt);
                BindingSource bs = new BindingSource();
                bs.DataSource = dt;
                dataGridView1.DataSource = dt;
                dataGridView1.ReadOnly = false;
                dataGridView1.Columns[1].ReadOnly = true;
                dataGridView1.Columns[2].ReadOnly = true;
                dataGridView1.Columns[3].ReadOnly = true;
                dataGridView1.Columns[4].ReadOnly = true;
                dataGridView1.Columns[5].ReadOnly = true;
                dataGridView1.Columns[6].ReadOnly = true;
                dataGridView1.Columns[7].ReadOnly = true;
                dataGridView1.Columns[8].ReadOnly = true;
            }
 private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
    {
        txtNumar.Text = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
        cmbValidat.Text = dataGridView1.SelectedRows[0].Cells[6].Value.ToString();
        cmbContat.Text = dataGridView1.SelectedRows[0].Cells[7].Value.ToString();
    }

我想从DataGridView获取值,并在我的ToolStrip文本框和组合框中查看它们,但是当我点击除column6或column7之外的其他一些列时,我收到此错误。谁能帮我理解我错过了什么?感谢

  

指数超出范围。必须是非负数且小于集合的大小。

3 个答案:

答案 0 :(得分:0)

此异常表示您尝试按索引访问项目集合,并且索引无效。然后你会得到这个错误。

因此建议您在访问之前检查Columns是否有有效的索引。

答案 1 :(得分:0)

dataGridView1.Columns[0].ReadOnly = true;
dataGridView1.Columns[1].ReadOnly = true;
dataGridView1.Columns[2].ReadOnly = true;
dataGridView1.Columns[3].ReadOnly = true;
dataGridView1.Columns[4].ReadOnly = true;
dataGridView1.Columns[5].ReadOnly = true;
dataGridView1.Columns[6].ReadOnly = true;
dataGridView1.Columns[7].ReadOnly = true;

从零开始索引,如在sql语句中提到的那样,你只有8列从0到7开始。所以dataGridView1.Columns [8] .ReadOnly = true;将上升例外“指数超出范围”。

答案 2 :(得分:0)

根据您的SQL语句,您将列调用错误。我认为应该遵循代码,因为数组从索引0开始而索引8将抛出outOfRangeException,因为数组的长度仅为0 - 7:

dataGridView1.Columns[0].ReadOnly = true;
dataGridView1.Columns[1].ReadOnly = true;
dataGridView1.Columns[2].ReadOnly = true;
dataGridView1.Columns[3].ReadOnly = true;
dataGridView1.Columns[4].ReadOnly = true;
dataGridView1.Columns[5].ReadOnly = true;
dataGridView1.Columns[6].ReadOnly = true;
dataGridView1.Columns[7].ReadOnly = true;

在下面你应该使用Numar,Validat和Contat不同的索引,否则你会有错误的值:

txtNumar.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
cmbValidat.Text = dataGridView1.SelectedRows[0].Cells[5].Value.ToString();
cmbContat.Text = dataGridView1.SelectedRows[0].Cells[6].Value.ToString();