Cancellare record da datagridview

di il
10 risposte

Cancellare record da datagridview

Ciao,
nel mio programma ho 3 gridview che prendono i dati da altrettante tabelle di un databse collegato tramite wizard al progetto.
Vorrei che, alla pressione del tasto "Canc", il record venisse eliminato non solo dalla datagridview ma proprio dal database.
Ho provato a cercare in giro per internet ma temo di non aver capito molto.
Comunque l'idea (sperando che abbia senso) è: sfruttare l'evento UserDeletingRow -> farmi dire quale riga l'utente sta cancellando -> utilizzare table.Rows.Remove per eliminarla.
Il problema è che non riesco a farmi dire quale riga viene eliminata.
Aspetto suggerimenti!

10 Risposte

  • Re: Cancellare record da datagridview

    Forse ho fatto qualche progresso:
    
    Private Sub RisultatiPrimaDataGridView_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles RisultatiPrimaDataGridView.UserDeletingRow
            Dim riga As DataGridViewRow = e.Row
            Dim nome As String = riga.Cells(0).Value
            MsgBox(nome)
            Dim table As DataTable = GolfDataSet.Tables("RisultatiPrima")
            Dim v = From o In table
                  Where o.Item("Nome") = nome
                  Select o
    
            table.Rows.Remove(v(0))
            RisultatiPrimaTableAdapter.Update(GolfDataSet)
            GolfDataSet.AcceptChanges()
        End Sub
    
    ma mi dà un'eccezione non gestita che riguarda l'indice della riga. Credo che si pianti su
    GolfDataSet.AcceptChanges()
  • Re: Cancellare record da datagridview

    Ciao minomic,
    quando hai collegato il DataGridView alle tabelle impostandone il DataSource (magari tramite wizard) hai stabilito che le modifiche fatte nel DataGridView si riflettano automaticamente nel DataTable opportuno.

    Quando l' utente cancella un record viene marcato come cancellato nel DataTable, per fare in modo che questa modifica venga salvata nel db basta che nell' evento UserDeletedRow (o oltrove, magari vuoi fare un salvataggio solo alla fine) tu scriva:
    
    RisultatiPrimaTableAdapter.Update(GolfDataSet)
    
    Non devi fare altro, se cancelli tu il record, come fai nell' esempio che hai scritto, in pratica lo cancelli due volte e sicuramente incorri in qualche problema.
  • Re: Cancellare record da datagridview

    Ciao, grazie della risposta ma c'è ancora qualche problema. L'eccezione è sparita ma il record viene cancellato solo dalla datagridview e non dal database. Infatti alla se chiudo il form con la datagridview e poi lo riapro quel record ricompare. Questo è il codice che ho usato:
    Private Sub RisultatiPrimaDataGridView_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles RisultatiPrimaDataGridView.UserDeletingRow
            RisultatiPrimaTableAdapter.Update(GolfDataSet)
            GolfDataSet.AcceptChanges()
        End Sub
    quando hai collegato il DataGridView alle tabelle impostandone il DataSource (magari tramite wizard) hai stabilito che le modifiche fatte nel DataGridView si riflettano automaticamente nel DataTable opportuno.
    In realtà non l'ho fatto tramite wizard, ma da data sources (a sinistra) ho semplicemente trascinato il nome della tabella sul form e questo ha generato la grid. Forse dipende da questo?
  • Re: Cancellare record da datagridview

    Ti confermo che funziona, ho provato pure io a creare il data grid trascinando la tabella.
    Non è importante comnumque l' AcceptChanges non è necessario.
    Controlla bene vedrai che c' è qualche svista. (magari non devi usare GolfDataSet o qualche errore di simile)
  • Re: Cancellare record da datagridview

    Mah ho controllato e non ho visto niente di strano, anche perchè ...update(GolfDataSet) è lo stesso metodo che usavo per aggiornare il database dopo gli inserimenti.
    Piuttosto è giusto usare l'evento userdeletingrow? A occhio direi di sì ma non si sa mai.
    Comunque l'errore non l'ho trovato
  • Re: Cancellare record da datagridview

    minomic ha scritto:


    Piuttosto è giusto usare l'evento userdeletingrow? A occhio direi di sì ma non si sa mai.
    Si è giusto, mah ... non so che dirti, prova a farti un progettino di test, qualcosa di semplice in cui l' errore fa fatica a nascondersi.
  • Re: Cancellare record da datagridview

    Allora: ho creato un nuovo progetto con solo una gridview per le gare. L'unica differenza con l'altro progetto è che qui c'è anche il navigator mentre nell'altro l'avevo tolto perchè non lo voglio.
    Posto il codice (tanto è cortissimo)
    Public Class Form1
    
        Private Sub GareBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GareBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.GareBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.GolfDataSet)
    
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: This line of code loads data into the 'GolfDataSet.Gare' table. You can move, or remove it, as needed.
            Me.GareTableAdapter.Fill(Me.GolfDataSet.Gare)
    
        End Sub
    
        Private Sub GareDataGridView_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles GareDataGridView.UserDeletingRow
            GareTableAdapter.Update(GolfDataSet)
            MsgBox("ok")
        End Sub
    End Class
    Ho fatto vari test:
    1) seleziono una riga -> premo canc -> la riga scompare -> chiudo e riapro l'applicazione -> la riga c'è ancora
    2) seleziono una riga -> premo canc -> seleziono un'altra riga -> premo canc -> chiudo e riapro -> è sparita solo la prima riga che avevo cancellato mentre la seconda c'è ancora
    Com'è possibile?
    PS. Ho fatto la prova e succede la stessa cosa anche nell'altro!
    Ho notato però che cliccando sull'icona "salva" del navigator le modifiche vengono salvate perfettamente. Quindi devo per forza usare quel codice che mi ha già messo lui in gareBindingNavigatorSaveItem_click?
  • Re: Cancellare record da datagridview

    Ho scoperto che funziona se al posto dell'evento userDeletINGRow si usa userDeletEDRow. Sarà un problema di sequenza temporale dei fatti?
    Comunque questa dovrebbe essere la soluzione definitiva:
    Private Sub RisultatiPrimaDataGridView_UserDeletedRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowEventArgs) Handles RisultatiPrimaDataGridView.UserDeletedRow
            RisultatiPrimaTableAdapter.Update(GolfDataSet)
            MsgBox("Eliminato " & nome_eliminare, MsgBoxStyle.OkOnly, "Informazione")
        End Sub
    
        Private Sub RisultatiPrimaDataGridView_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles RisultatiPrimaDataGridView.UserDeletingRow
            Dim riga As DataGridViewRow = e.Row
            nome_eliminare = riga.Cells(0).Value
        End Sub
    Alla fine uso anche l'evento deletingRow per salvare il nome del giocatore eliminato un attimo prima che venga distrutto. Direi che funziona tutto ma ovviamente ogni consiglio è prezioso!!!
  • Re: Cancellare record da datagridview

    Ciao minomic,
    e ciao anche al nostro spammatore automatico 'angle' (è già la terza o quarta volta che compare sempre con nomi diversi).

    Non aveno notato il Deleting/Deleted. Uno viene chiamato prima che il record venga cancellato, per permetterti di annullare l' operazione, l' altro dopo che è stato marcato come eliminato.
    Giustamente il salvataggio va fatto nel secondo.
  • Re: Cancellare record da datagridview

    Perfetto allora. Dubbio risolto!
    grazie!!
    e grazie anche a angle! non so se senza il suo aiuto ce l'avrei fatta!
Devi accedere o registrarti per scrivere nel forum
10 risposte