Индекс за пределами диапазона. 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 сделать аргументы индексатора именно в таком порядке, но что поделать.