"Ссылка на объект не указывает на экземпляр объекта" при попытке удаления строки в datagridview c#
В dataGridView1 расположена таблица из бд с 11 столбцами + отдельно прописан столбец "Удалить" через linkcell. Сейчас пытаюсь прописать код, чтобы при нажатии на эту ссылку удалялась строка. Собственно, вот её код:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 11)
{
string execute = dataGridView1.Rows[e.RowIndex].Cells[11].Value.ToString();
if (execute == "Delete")
{
if (MessageBox.Show("Удалить этот заказ?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
int rowIndex = e.RowIndex;
dataGridView1.Rows.RemoveAt(rowIndex);
dataSet.Tables["Заказы"].Rows[rowIndex].Delete();
sqlDataAdapter.Update(dataSet, "Заказы");
}
}
}
}
Через отладчик поймал ошибку здесь
dataSet.Tables["Заказы"].Rows[rowIndex].Delete();
Изначально думал, что ошибка в том, что с этой таблицей по внешнему ключу связана вторая таблица. Прописал в ВК on delete cascade on update cascade, всё обновил, но ошибка всё равно вылезает.
В чём может быть причина?
Rows.Count = 4, при удалении последней строки (как раз-таки четвёртой) rowIndex = 3.
Ответы (1 шт):
Автор решения: Bulson
→ Ссылка
Пример не на Access, но сути это не меняет
public partial class FormMain : Form
{
private const string _conString = @"Data Source=(localdb)\MSSQLLocalDB;" +
"Initial Catalog=DatabaseOneTable;" +
"Integrated Security=True;";
private const string _selectString = "SELECT * FROM People";
private readonly DataTable _dataTable;
public FormMain()
{
InitializeComponent();
_dataTable = new DataTable();
this.Load += FormMain_Load;
}
private void FormMain_Load(object sender, EventArgs e)
{
try
{
using (var adp = new SqlDataAdapter(_selectString, _conString))
{
//читаем данные заполняем данными таблицу
int countRecords = adp.Fill(_dataTable);
Trace.WriteLine($"Прочитано {countRecords}");
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
_dataGridView.AutoGenerateColumns = false;
_dataGridView.DataSource = _dataTable;
_dataGridView.CellClick += DataGridView_CellClick;
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
//проверяем, что кликнули по нужного типа ячейке
var linkCell = _dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewLinkCell;
if (linkCell == null)
return;
var id = (int)_dataGridView.Rows[e.RowIndex].Cells["_columnId"].Value;
var row = _dataTable.AsEnumerable().First(r => r.Field<int>("Id") == id);
//удаляем
row.Delete();
try
{
//обновляем в БД (команду DELETE строит билдер)
using (var adp = new SqlDataAdapter(_selectString, _conString))
using (var cmb = new SqlCommandBuilder(adp))
{
var deleted = adp.Update(_dataTable);
Trace.WriteLine($"Удалено {deleted}");
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
}