DataGridView a mazanie   otázka

VB.NET

Caute

mam na forme DataGridView do ktoreho taham udaje meno, priezvisko, datum narodenia z tabulky studenti. Dalej mam na forme tlacidlo "Vymazat". Potreboval by som poradit ako urobit mazanie dat, teda ak kliknem v Gride na konkretny riadok a stlacim tlacislo vymazat tak aby mi tento zaznam zmazalo z databazy?

vdaka

cujan

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Myslím, že by nebylo od věci trošku popsat jakým způsobem plníte tento DataGridView popř. jsem hodit trochu kodu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Cau, jasne

takze DataGridView plnim pomocou datasetu PrehladDataset

a rad by som pripojil aj nejaky kod ale vsetko som to len naklikal vo wizarde :-)

vdaka

cujan

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud máš u DataGridView vlastnost ReadOnly = False, můžeš řádek smazat označením a stisknutím DEL. Pokud potřebuješ používat tlačítko, udělal bych to asi takhle: (Není to vyzkoušený)

    Private Sub Button1_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) Handles Button2.Click
        Try
            DG1.Rows.Remove(DG1.SelectedRows(0))
        Catch
            'Není vybrána žádná řádka, nebo nelze smazat
        End Try
    End Sub

A ještě je důležitý nahrát změnu do databáze. Zatím se to změnilo jen v Datasetu.

   OleDbDataAdapter1.Update(PrehladDataset)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

no neviem preco ale nefunguje mi to :-( neda s to riesit njekao cez napr. sql ?

vdaka

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud to chcete řešit přes Sql, nepoužívejte wizard.

Musíte napsat co vám přesně nefunguje. Smazání řádky v tabulce nebo nahrání změny do databáze?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

no tak zatial mi nefunguje ani jedno ani druhe, nie je mi jasne ako nastavit mazanie vybraneho riadka a nasledne ako zabezpecit aby sa tieto zmeny prejavili aj v databaze.

vdaka

cujan

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud označíte řádek myší (kliknete na šedivý sloupeček uplně vlevo, tak aby se na něm ukázala malá černá šipka) a zmáčknete na klávesnici Del, smaže se vám ten řádek? Jestli ne, musíte tuším nastavit vlastnost ReadOnly na False.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mozno by mi stacila jedna vec ak by si mi poradil ako mozem zistit napr. id riadka v databaze na ktory mam aktualne kliknute v gride

vdaka

cujan

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Řešení (inspiraci) naleznete v některém z posledních videí Tomáše Hercega na MSTV, Začínáme s ASP.NET, Petr

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback