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;
  1. 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"];
  1. 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;
  1. 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?