Witajcie,
chciałbym podpytać o dobre praktyki nt datagridview prezentującego dane z zapytania SQL. Zagwozdka polega na tym, że część wyników z query istnieje w bazie (komórka grida powinna zrobić update), a część nie (ze wzlędu na left join w zapytaniu) - tu potrzebny insert.
Logicznie rozbiłem rzecz na 3 etapy:
0 obiekty:
DataGridViewCell _activeCell;
DataGridViewCell _twIdCell;
bool _willInsert;
- zdarzenie CellEnter: tu pobieram aktywną komórkę, oraz komórkę z ukrytej kolumny, gdzie znajduje się identyfikator
_activeCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
_twIdCell = dataGridView1.Rows[e.RowIndex].Cells["Id"];
- zdarzenie CellValidating, tu sprawdzam, czy wartość komórki jest nullem w bazie (tj czy dalej będzie robiony insert, czy update)
if (_activeCell.Value == DBNull.Value)
_willInsert = true;
else
_willInsert = false;
- zdarzenie CellValueChanged
obiektBindingSource.EndEdit();
try
{
SqlCommand sqlCmd = new SqlCommand();
sqlCmd = sq.dbc.CreateCommand();
// UPDATE istniejącej wartości
if (_willInsert == false)
{
sqlCmd.CommandText = (<kod>);
}
// INSERT nowego rekordu
else
{
sqlCmd.CommandText = (<kod>);
}
sqlCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("error " + ex.Message);
}
Teraz pytanie: czy takie podejście jest słuszne, czy powinienem raczej operować na datatable, który jest źródłem grida?