|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
[VB2010] - Refresh DataTable e DataGridView
Salve ragazzi,
avendo a disposizione una DataTable (definita Dtb nel mio progetto) e una DataGridView; col seguente codice elimino il record X selezionato nella griglia: Codice:
Dim Cmd As OleDbCommand
Dim Valore_ID As Long
Cmd = New OleDbCommand
Try
'Cnn.Open()
Cmd.Connection = Cnn
Valore_ID = Dtb.Rows(Riga).Item(0)
Cmd.CommandText = "DELETE FROM [" & Tabella & "] WHERE [" & Dtb.Columns(0).ColumnName & "]=" & Valore_ID & ""
cmd.ExecuteNonQuery()
Cnn.Close()
MsgBox("Record deleted Successfully.", , "Delete Record")
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
Cnn.Close()
Se chiudo e riapro il mio programma questo record, giustamente, manca Grazie
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 404
|
dopo l'eliminazione svuota la datagrid e ricarica i dati dal db
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Quote:
Codice:
dgvBiblioteca.DataBindings.Clear()
dgvBiblioteca.DataSource = Nothing
dgvBiblioteca.DataMember = Nothing
dgvBiblioteca.Rows.Clear()
dgvBiblioteca.Refresh()
Codice:
dgvBiblioteca.DataSource = Dtb
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 404
|
Quote:
Ultima modifica di jackk87 : 10-11-2010 alle 14:18. |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Quote:
E' impossibile che per ogni eliminazione debbo ricaricare il DataTable...
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Ma forse era meglio fare il percorso inverso, ossia popolare il DataGridView in modalità disconnessa. Quando un utente esegue un'operazione, come la Delete, prima ti pigli l'id della riga, e poi aggiorni tu il DB con un semplice Command. In questo modo elimini alla radice ogni problema di refresh...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Quote:
...sono un pò confuso; questo è il codice con cui elimino il record e all'interno mi daresti una diritta su come e dove posizionare le righe di codice per far ciò che mi consigli? Codice:
Dim Cmd As OleDbCommand
Dim Valore_ID As Long
Cmd = New OleDbCommand
Try
'Cnn.Open()
Cmd.Connection = Cnn
Valore_ID = Dtb.Rows(Riga).Item(0)
Cmd.CommandText = "DELETE FROM [" & Tabella & "] WHERE [" & Dtb.Columns(0).ColumnName & "]=" & Valore_ID & ""
cmd.ExecuteNonQuery()
Cnn.Close()
MsgBox("Record deleted Successfully.", , "Delete Record")
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
Cnn.Close()
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Bah, non è che quel codice mi entusiasmi poi molto...
Inoltre non sono d'accordo sulla costruzione della stringa sql. Se proprio vuoi, usa almeno i parameters ! Personalmente la risolverei in modo molto più agile. 1. Eseguo il Binding tra il DataGridView e il DataSet "DS" ( o DataTable che sia ), precedentemente "fillato" con apposito Adapter "DA" : Codice:
DA.Fill(DS)
DataGridView1.DataSource = DS.Tables(0)
Codice:
Private Sub cmd_applica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_applica.Click
If DS.HasChanges() Then
Using CB As New OleDb.OleDbCommandBuilder(DA)
DA.UpdateCommand = CB.GetUpdateCommand
DA.InsertCommand = CB.GetInsertCommand
DA.DeleteCommand = CB.GetDeleteCommand
DA.Update(DS)
End Using
DS.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If
End Sub
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Quote:
Grazie del tuo aiuto ma sono nuovo di VB2010 e di Oledb. Se volessi abbinare il tuo codice al mio da dove dovrei iniziare? Non mi è chiaro il concetto del binding...
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Perciò per applicare le modifiche al DB, basta controllare se DS "HasChanges" e agire come nel secondo blocco di codice che ho postato. Secondo me è molto meglio come soluzione, ed anche più elegante, piuttosto che stare a gestire ogni possibile azione dell'utente separatamente...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Quote:
Codice:
Sub Eliminazione()
Adapter.Fill(Ds)
Ds.Tables(0).Rows(Riga).Delete()
Riga = 0
dgvBiblioteca.DataSource = Ds.Tables(0)
If Ds.HasChanges = True Then
Using CB As New OleDb.OleDbCommandBuilder(Adapter)
Adapter.UpdateCommand = CB.GetUpdateCommand
Adapter.InsertCommand = CB.GetInsertCommand
Adapter.DeleteCommand = CB.GetDeleteCommand
Adapter.Update(Ds)
End Using
Ds.AcceptChanges()
MsgBox("Modifiche Salvate", MsgBoxStyle.Information, "OK")
End If
End Sub
![]()
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
...per ultimo ho provato questo codice:
Codice:
Dim Cmd As New OleDbCommand("DELETE FROM [" & Tabella & "] WHERE [" & Ds.Tables(Tabella).Columns(0).ColumnName & "]=" & Valore_ID & "", Cnn)
Dim Adp As New OleDbDataAdapter
Adp.SelectCommand = Cmd
Dim Dst As New DataSet(Tabella)
Adp.Fill(Dst)
Dst.Tables(Tabella).Rows(Riga).Delete()
Riga = 0
Adp.Update(Dst)
![]()
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
...ancora quest'altro codice
Codice:
CnnString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & AppPath() & DB & ";Jet OLEDB:Database Password=" & PW
Conn = New OleDbConnection(CnnString)
StrSql = "DELETE * FROM [" & Tabella & "] WHERE [" & Ds.Tables(Tabella).Columns(0).ColumnName & "]=" & Valore_ID & ""
Conn.Open()
Adapter = New OleDbDataAdapter(StrSql, Conn)
Adapter.Fill(Ds, Tabella)
Adapter.Update(Ds, Tabella)
With MyGrid
.DataSource = Ds.Tables(Tabella).DefaultView
End With
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
No, non ci siamo. Non devi cercare di fondere le due soluzioni assieme. Si fa solo un gran casino.
La prima tua soluzione è inutile. Non serve fare il Fill dell'Adapter sul DataSet tutte le volte che un utente fa una Delete... Il secondo codice è per me incomprensibile : se usi un semplice Command, a quel punto non serve a nulla un DataSet... Se vuoi usare la MIA soluzione devi solo aggiungere un pulsante di "Applica Modifiche", collegare il DataGridView al DataSet ( Binding... ), lasciare che l'utente faccia le sue operazioni, e applicarle al DB come ho illustrato. Se vuoi usare la TUA soluzione, è tutta un'altra cosa : allora popolerai il DataGridView in modalità disconnessa, e poi ti vai a gestire una per una le possibili azioni : Update-Delete-Insert... Che è sicuramente più prolissa e meno elegante, come cosa. Una qualsiasi combinazione di queste due "soluzioni-tipo" è per me superflua, è uno spreco di risorse di calcolo, e inoltre porta ad errori, come infatti ti è successo. Spero di essere stato un po' più chiaro...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Quote:
Intanto grazie per la tua pazienza Mi sento molto confuso in quanto cose che prima riuscivo a farle ad occhi chiusi adesso mi vengono complicatissime. Ciò che voglio realizzare è proprio quello di dare la possibilità all'utente tramite alcuni bottoni di fare l'inserimento, l'aggiornamento o la eliminazione del record selezionato nel DataGridView. 1) Come popolare il DataGridView in modalità disconnessa? Non basta che nel form load lo popolo collegandolo al mio DatSet? 2) Come gestire una per una le possibili azioni : Update-Delete-Insert? Debbo lavorare sullo stesso DataSet o debbo utilizzare un DataTable, un DataReader o simili...?
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Salve ragazzi,
alla fine ho risolto così: Codice:
Private Sub Aggiornamento(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.UpdateCommand = Cnn.CreateCommand
Adp.UpdateCommand.CommandText = StrSQL
Adp.UpdateCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record aggiornato con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
Private Sub Eliminazione(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.DeleteCommand = Cnn.CreateCommand
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
Adp.DeleteCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record eliminato con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
Private Sub Inserimento(ByVal MyGrid As DataGridView)
Try
Dim Cnn As New OleDb.OleDbConnection(CnnString)
Cnn.Open()
Adp.InsertCommand = Cnn.CreateCommand
Adp.InsertCommand.CommandText = StrSQL
Adp.InsertCommand.ExecuteNonQuery()
Me.Cursor = Cursors.Default
MsgBox("Record inserito con successo", MsgBoxStyle.Information, NomeApplicazione)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Dst.Clear()
Adp.Fill(Dst)
MyGrid.DataSource = Dst.Tables(0)
End Sub
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Noooo...
Vabbeh, Luca. Contento te...
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
..sicuramente sei contraio al fill ripetuto vero?
Però ho preso spunto un pò dal tuo codice Troverò una via alternativa e quindi snellirò il progetto. Invece perchè non dai un'occhiata all'altro mio thread?
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
E' soprattutto questione di "stile personale", perciò non è una critica. Almeno questo però non farlo ! : Codice:
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
__________________
Contattami su FaceBook --> [ ::: MarcoGG su FaceBook ::: ] Visita il mio Blog --> [ ::: Il Blog di MarcoGG ::: ] |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Catania
Messaggi: 2690
|
Quote:
Che ben vengano le tue pseudo "critiche" perchè sono state molto produttive! Non capisco perchè non debbo fare: Codice:
Adp.DeleteCommand.CommandText = "DELETE * FROM [" & Tabella & "] WHERE [" & Dst.Tables(0).Columns(0).ColumnName & "]=" & Valore_ID & ""
__________________
Unisciti a noi: http://www.swproduction.altervista.org/ - http://www.enews.altervista.org/
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:38.






















