| Já jsem před rokem s editací tabulek podkladové DB v Datagridview začínal podobně, tedy naklikáním ve wizardu a když jsem si pak prohlédl tři a půl tisíce řádků kódu, který designer na tu jednoduchou úlohu vyprodukoval a kterému jsem hlavně z větší části nerozuměl, šel jsem na to "ručně", tedy vlastní deklarací a použitím objektů SqlConnection, SqlCommand, SqlDataAdapter a BindingSource. Samotného by mě zajímal názor opravdového odborníka na srovnání těchto dvou postupů. Přikládám pár kousků kódu: 
Private con As SqlConnection 'Spojeni na databazi
Private cmdSeznam As SqlCommand 'SQL příkaz pro SELECT z tabulky Seznam
Private daSeznam As SqlDataAdapter 'DataAdapter pro tabulku Seznam
Private ds As DataSet 'Dataset
Private WithEvents bsSeznam As BindingSource 'Datový zdroj spojující Dataset a zobrazovací mřížku Seznam
Private Const mTabulkaSeznam As String = "Seznam" 'Název tabulky
  Private Function InitTable() As Boolean
    'Úvodní inicializace
    InitTable = False
    ds = New DataSet
    Try
      con = New SqlConnection(My.Settings.ConStr) 'Tady je connectionstring
      con.Open() 'Otevření spojení na databázi
      cmdSeznam = New SqlCommand("SELECT * FROM " + mTabulkaSeznam + " ORDER BY SEZ_ID", con) ' SELECT, kterým se získají data z DB (upravit * na konkrétní výčet požadovaných sloupců)
      cmdSeznam.CommandType = CommandType.Text
      daSeznam = New SqlDataAdapter(cmdSeznam)
      daSeznam.MissingSchemaAction = MissingSchemaAction.AddWithKey
      Dim cbSeznam As New SqlCommandBuilder(daSeznam)
      daSeznam.InsertCommand = cbSeznam.GetInsertCommand
      daSeznam.UpdateCommand = cbSeznam.GetUpdateCommand
      daSeznam.DeleteCommand = cbSeznam.GetDeleteCommand
      daSeznam.Fill(ds) 'Naplnění dat z podkladové DB do objektu DataTable v datasetu
      ds.Tables(ds.Tables.Count - 1).TableName = mTabulkaSeznam
      bsSeznam = New BindingSource(ds, ds.Tables(ds.Tables.Count - 1).TableName) 'Vytvoření datového zdroje pro mřížku
      dgvSeznam.DataSource = bsSeznam 'provazani mrizky s datovym zdrojem
      InitTable = True
    Catch exc As SqlException
      MessageBox.Show(exc.ErrorCode & vbCrLf & exc.Message)
    Catch exc As Exception
      MessageBox.Show(exc.Message)
    Finally
      If con.State = ConnectionState.Open Then con.Close()
    End Try
  End Function
Tabulka v datasetu průběžně "eviduje" všechny editační změny v mřížce, které provádíš. Pokud chceš tyto změny uložit do podkladové DB, zavoláš funkci UlozZmeny - viz nize. 
  Private Sub UlozZmeny(ByRef da As SqlDataAdapter, ByVal sTable As String)
'Procedura, která promítne změny provedené v mřížkách do databáze, volá se při změně aktuálního řádku v mřížce
    BindingContext(ds.Tables(sTable)).EndCurrentEdit() 'Ukončení editace
    Dim dt As DataTable = ds.Tables(sTable).GetChanges 'Změněné řádky
    If dt IsNot Nothing Then
      da.Update(dt) 'Update databáze
      For Each dr As DataRow In ds.Tables(sTable).Select("", "", (DataViewRowState.CurrentRows And Not DataViewRowState.Unchanged) Or DataViewRowState.Deleted)
        dr.AcceptChanges()
      Next
    End If
  End Sub
Takhle jsem to vrychlosti vypáral z hotového kódu, snad to pomůže. Minimálně v tom, že si můžeš nastudovat další věci o použitých třídách. |