删除时索引超出范围

时间:2012-01-20 18:15:32

标签: c#

为什么我会收到此错误(索引超出范围。必须是非负数且小于集合的大小。)

代码:

            object value = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex ].Value;
            object minus = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value;
            object delte = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 2].Value;

            if (value is DBNull || minus is DBNull || delte is DBNull) { return; }
            else if (value.Equals("+"))
            {
                produseTableAdapter.PlusCantitate(DateTime.Now, dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex -5].Value.ToString());
                FillData();
                dataGridView1.Rows[e.RowIndex].Selected = true;
            }
            else if (minus.Equals("-"))
            {
                produseTableAdapter.MinusCantitate(DateTime.Now, dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 5].Value.ToString());
                FillData();
                dataGridView1.Rows[e.RowIndex].Selected = true;
            }
            else if (delte.Equals("Delete"))
            {
                if (MessageBox.Show("Really ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
                {
                    produseTableAdapter.DeleteQuery(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 5].Value.ToString());
                    FillData();
                    dataGridView1.Rows[e.RowIndex].Selected = true;
                }
                else { return; }
            }

问题在于细胞[e.ColumnIndex + 1]&&单元格[e.ColumnIndex + 2]。 对象值的下一个单元格是另一个按钮,然后是另一个按钮。我怎样才能得到这个按钮的索引?

3 个答案:

答案 0 :(得分:2)

当你删除最后一行并将Selected Row设置为之前删除的行时,它可能与Delete按钮有关。

答案 1 :(得分:2)

因为你试图访问一个不存在的行。

    produseTableAdapter.PlusCantitate(DateTime.Now, dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex -5].Value.ToString());
    FillData();
    dataGridView1.Rows[e.RowIndex].Selected = true;

例如,如果网格中有4行,则在第一行中,您将从数据库和第二行删除记录,您正在重新加载网格数据。所以现在它没有第4排。但是你仍然试着在第4行进行一些操作。在你的第3行。

将第3行更改为此

  if(e.RowIndex>0)
  {
     int newIndex=e.RowIndex-1;
     dataGridView1.Rows[newIndex].Selected = true;
  }

答案 2 :(得分:1)

您的一行[]或单元格[]引用必须超出实际数据的范围。确保行和列索引(尤其是在减去或添加常量的情况下)在数据范围内。