Пожалуйста, объясните мне, что происходит. Я создал приложение WinForms .NET, которое имеет DataGridView в форме и должно обновлять базу данных при использовании встроенного редактирования DataGridView.
Форма имеет SqlDataAdapter _da с четырьмя привязанными к ней командами SqlCommand. DataGridView напрямую привязан к DataTable _names.
Такой обработчик CellValueChanged:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
_da.Update(_names);
}
не обновляет состояние базы данных, хотя _names DataTable обновляется. Все строки _names имеют RowState == DataRowState.Unchanged
Хорошо, я модифицировал обработчик:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DataRow row = _names.Rows[e.RowIndex];
row.BeginEdit();
row.EndEdit();
_da.Update(_names);
}
этот вариант действительно записывает измененную ячейку в базу данных, но когда я пытаюсь вставить новую строку в сетку, я получаю сообщение об отсутствии строки с индексом e.RowIndex
Итак, я решил доработать обработчик:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (_names.Rows.Count<e.RowIndex)
{
DataRow row = _names.Rows[e.RowIndex];
row.BeginEdit();
row.EndEdit();
}
else
{
DataRow row = _names.NewRow();
row["NameText"] = dataGridView1["NameText", e.RowIndex].Value;
_names.Rows.Add(row);
}
_da.Update(_names);
}
Когда я вставляю новую строку в сетку, происходят действительно странные вещи: сетка остается такой, какой была до _names.Rows.Add (row); После этой строки в таблицу вставляются ТРИ строки - две строки с одинаковым значением и одна с нулевым значением.
Немного измененный код:
DataRow row = _names.NewRow();
row["NameText"] = "--------------"
_names.Rows.Add(row);
вставляет три строки с тремя разными значениями: одна, как введено в сетку, вторая со значением «--------------» и третья - со значением Null.
Я действительно застрял в догадках, что происходит.