Индекс за пределами диапазона. e.RowIndex

Через отладчик проверил, значение строки равно 0, а столбца 4. Не понимаю что не так. Помогите.

private void dataGridView3_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            using (SqlConnection connection = new SqlConnection(newConnection))
            {
                connection.Open();

                try
                {
                    newValueInDGW3 = dataGridView3[e.RowIndex, e.ColumnIndex].Value.ToString();

                    for (int i = 0; i <= dsGeneralData.Tables["GeneralData"].Rows.Count; i++)
                    {
                        string cellDataGrid = dataGridView3.Rows[e.RowIndex].Cells["Наименование"].Value.ToString();
                        string cellDataSet = dsGeneralData.Tables["GeneralData"].Rows[i]["Наименование"].ToString();

                        if (cellDataGrid == cellDataSet)
                        {
                            int boxes = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[2].Value);
                            int sold = Convert.ToInt32(dataGridView3.Rows[e.RowIndex].Cells[2].Value);
                            int elemRemains;
                            int remains = Convert.ToInt32(dataGridView3.Rows[e.RowIndex].Cells[4].Value);
                            int finRemains;

                            elemRemains = boxes - sold;

                            if (elemRemains < 0)
                            {
                                remains = remains + elemRemains;

                                for (int g = 1; remains <= 0; g++)
                                {
                                    remains++;
                                    elemRemains++;

                                    if (elemRemains < 0)
                                    {
                                        MessageBox.Show("Невозможно вычесть из остатка недостающие число, так как остаток меньше нуля.",
                                            "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                    }
                                }
                            }

                            finRemains = elemRemains + remains;

                            SqlCommand updateGeneralData = new SqlCommand($"UPDATE dbo.GeneralData SET Остаток = @Ост WHERE Код = @Код", connection);

                            updateGeneralData.Parameters.AddWithValue("@Ост", finRemains);
                            updateGeneralData.Parameters.AddWithValue("@Код", i);
                            updateGeneralData.ExecuteNonQuery();

                            SqlCommand updateProduct = new SqlCommand($"UPDATE dbo.Product SET Остаток = @Ост WHERE Наименование = @Наименование", connection);

                            updateProduct.Parameters.AddWithValue("@Ост", finRemains);
                            updateProduct.Parameters.AddWithValue("@Наименование", cellDataSet);
                            updateProduct.ExecuteNonQuery();
                        }

                        break;
                    }         
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

        }

Ответы (1 шт):

Автор решения: aepot

Если посмотреть на исходники винформ, то у DataGridView можно обнаружить индексатор, который работает не так как вы думали.

public DataGridViewCell this[int columnIndex, int rowIndex]

А вы ему передаете [e.RowIndex, e.ColumnIndex]. Поменяйте аргументы индексатора местами.

Очень странное решение Microsoft сделать аргументы индексатора именно в таком порядке, но что поделать.

→ Ссылка