Aggirnamento Grid

venerdì 03 ottobre 2008 - 09.29

Jok83 Profilo | Junior Member

Ciao a tutti, ho un problema:

- ho una datagridview su form1 che è collegata con una tabella del mio DB quando la apro funziona tutto perfettamente visualizzo i dati e posso selezionarli.Per modificarli apro una nuova form dove tutti i campi della grid sono nei vari textbox ecc.. immmetto i nuovi dati modifico tutto funzionama non vedo aggiornata la grid se non esco completamente dall'applicazione e rientro.
- Ho letto sui post precedenti e si dice che è dovuto al fatto che eseguo direttamente il comando sql passando la query di update come stringa ed in effetti faccio cosi:
sql = "UPDATE RcaPT SET PTRagSoc='" & TxtRagSoc.Text.Trim & "' WHERE PTCod ='" & TxtPtCod.Text.Trim & "'"
Dim cn As New SqlClient.SqlConnection(cnstr)
Try
Dim update As SqlClient.SqlCommand = New SqlClient.SqlCommand(sql, cn)
cn.Open()
update.ExecuteReader()
Catch ex As Exception
MsgBox(ex.Message)
Finally
cn.Close()
End Try
e ho letto che per aggiornare la grid devo riassegnare la sorgente a datagrid.datasource e fare datagrid.databind()
solo che per fare l'update non uso dataset e l'unico che c'è è quello creato con il databindig, e tra le funzioni della mia grid non c'è .databind...

In parole povere come faccio ad Aggiornare una datagrid o il dataset o anche a ricaricare il db in modo che la grid si veda aggiornata immediatamente..

Spero di essermi spiegato grazie..

Lanello Profilo | Senior Member

che sistema usi per riempire la griglia all'apertura del form?

fai manuale con i recordset o hai messo il binding ai dati dal designer e fai la fill?
----------------------------------------------------------------------
http://www.flashinlabs.biz o .com o .net o .it fate voi :P

Jok83 Profilo | Junior Member

Intanto grazie per il tempo che mi dedichi..

Ho messo il binding ai dati di una tabella da progetto sulla grid e nella load ho il fill sul dataadpter:
'TODO: questa riga di codice carica i dati nella tabella 'RCAATTIVAZIONIDataSet.RcaPT'. È possibile spostarla o rimuoverla se necessario.
Me.RcaPTTableAdapter.Fill(Me.RCAATTIVAZIONIDataSet.RcaPT)
Per farti capire meglio sulla form uno c'è questa grid che serve solo a visualizzare i dati è selezionare un record, da qui si apre una form 2 per l'inserimento e l'aggiornamento di un singolo record, fatto come hai visto sopra, e la grid non s'aggiorna ma le insert vanno a buon fine.. mentre da una terza form faccio dei filtri:
form3:
sql &= TxtCerca.Text & "'"
Dim cn As New SqlClient.SqlConnection(cnstr)
Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(sql, cn)
Dim da As New SqlClient.SqlDataAdapter

Try
da.SelectCommand = cmd
Dim dsgrid As New DataSet
da.Fill(dsgrid, "GRID")
' vediamo se pesco qualcosa
'Dim rw As DataRow
'For Each rw In dsgrid.Tables(0).Rows
' sql = rw.Item(1).ToString
'Next
FrmStatoAttivazione.CaricaGridDopoRicerca(dsgrid)
Catch ex As Exception
MsgBox("ERRORE")
End Try
'chiudo la form ricerca
Me.Close()

form2:
Public Sub CaricaGridDopoRicerca(ByRef ds As DataSet)
' qui riesco ad aggiornare la grid perchè passo un nuovo dataset..
DtgwPT.DataSource = ds.Tables(0)
End Sub
e così s'aggiorna perchè le passo il dataset, che non ho nell'altra form perchè quando vado a fare l'Update non lo uso..
Sono alle prime armi probabilmente non sto seguendo il metodo migliore però mi interessa capire come dirgli di rileggere la sorgente dei dati...

Jok83 Profilo | Junior Member

Altrimenti poichè avevo provato anche la soluzione, a mio avviso più bella di crearmi la insert o l'update con il commandbuilder, però probabilmente perchè non lo so usare riesco ad aggiornare la grid ma non il db quindi mi ritrovo con due metodi ma nessuno dei due mi da una situazione di allineamento tra DB e datagrid..se mi fate un esempio magari di una insert e aggiornamento grid con il command builder ve ne sarei grato..

Lanello Profilo | Senior Member

mhm mi pare che sei un po incasinato...

sia per l'uso dei databinding che per il modo in cui interagisci con i dati... ma davvero ti servono 3 form per visualizzare, modificare e filtrare i dati?

io ho provato mille sistemi diversi con i dataset ed i binding ai dati, ma francamente mi trovo abbastanza male, sia per il modo in cui vanno costruiti, sia per le prestazioni delle tabelle in caso di molti dati... (non so, magari molti mi smentiranno)

sarà anche perchè sono abituato a lavorare parecchio con database non microsoft e quindi con pochi sistemi di binding avanzato come con sql server...

io utilizzo il vecchio sistema ado "manuale" che preferisco di lunga

sai il sistema dove con la libreria giusta per il database in uso

crei la connessione crei l'oggetto command crei l'oggetto recordset command.conn=connessione command.text="LA TUA BELLA QUERY SQL" recordset=command.execute while recordset.read() aggiungi una riga alla griglia con i dati che hai nel recordset end while

ecco qua il "vecchio" sistema della griglia disconnessa dai dati.

quando devi modificare vai a prendere l'id della riga modificata (volendo anche direttamente sulla griglia) e fai l'update, oppure l'insert se è un record nuovo, e appena fatto quello richiami la funzione che ti riempie di nuovo la tabella, se ci metti i giusti parametri puoi usare la stessa funzione di riempimento anche per filtrare il tutto

private sub AggiornaTabella (byval optional condizioneWhere as string)

idem per la delete e tutto quello che vuoi.

sicuramente non andrò veloce come chi usa i binding che può fare un piccolo progetto di "gestione di una libreria" in 10 minuti, ma sicuramente sono SICURO di quello che ottengo e posso intervenire in qualsiasi punto del codice.

ps: anche solo con un thread separato per riempire le varie righe della tabella se i dati sono molti... se con il binding fai un .fill anche su un thread separato fino a che non ha finito la raccolta dati non ti popola la griglia!
----------------------------------------------------------------------
http://www.flashinlabs.biz o .com o .net o .it fate voi :P

Jok83 Profilo | Junior Member

-->mhm mi pare che sei un po incasinato...

Si ho iniziato da poco a programmare

-->sia per l'uso dei databinding che per il modo in cui interagisci con i dati... ma davvero ti servono 3 form per visualizzare,
-->modificare e filtrare i dati?

Lo so si poteva far su una ma 2 form sono (purtroppo) un'esigenza dettatami, in una vogliono solo visualizzare lo stato dei record mentre nell'altra attraverso varie tab modificano e inseriscono, la terza per i filtri l'ho creata io perchè la richiamo in molte parti dell' applicazione..

Per quanto riguarda la grid invece ho risolto sempre senza commandbuilder praticamente prima eseguo l'insert come sopra:
Dim cn As New SqlClient.SqlConnection(cnstr) Try Dim update As SqlClient.SqlCommand = New SqlClient.SqlCommand(sql, cn) cn.Open() update.ExecuteReader() Catch ex As Exception MsgBox(ex.Message) Finally cn.Close() End Try

poi ricarico la grid facendole ripescare i dati:

Dim sql As String Dim cn As New SqlClient.SqlConnection(cnstr) sql = "Select * From RcaPT" Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(sql, cn) Dim da As New SqlClient.SqlDataAdapter da.SelectCommand = cmd Dim ds As New DataSet da.Fill(ds, "Tutto") DtgwPT.DataSource = ds.Tables(0)

Sicuramente non è il metodo migliore e con la prestazione migliore però la commandbuilder non son riuscito a capirla..
Proverò la tua soluzione, anzi seguirò il tuo metodo che mi sembra una linea precisa e ti farò sapere..grazie dell'aiuto!

alexmed Profilo | Guru

Ciao e scusate l'intrusione
Hai detto di avere questa linea di codice

'TODO: questa riga di codice carica i dati nella tabella 'RCAATTIVAZIONIDataSet.RcaPT'. È possibile spostarla o rimuoverla se necessario.
Me.RcaPTTableAdapter.Fill(Me.RCAATTIVAZIONIDataSet.RcaPT)

Giusto?

Hai detto che apri una Form2 per modificare i dati.

Giusto?

Ecco.
Allora copia le righe di codice dopo

Form2.ShowDialog()
Me.RcaPTTableAdapter.Fill(Me.RCAATTIVAZIONIDataSet.RcaPT)

Fino a quando il Form2 è in esecuzione il comando si ferma
quando chiudi il form2 ti aggiorna la DateGridViw

Ciao

Lanello Profilo | Senior Member

si, io sono d'accordissimo, ma in questo modo riesegue la FILL di tutta la tabella!!!!

fino a che ha 50 record tutto va bene, ma quando diventano 1000 o + sai che "clessidre"

se gestisci "a mano" i dati, alla form puoi passare il singolo record da modificare, e poi nella griglia aggiornare SOLO la riga corrispondente a quel record!!!
----------------------------------------------------------------------
http://www.flashinlabs.biz o .com o .net o .it fate voi :P

Jok83 Profilo | Junior Member

Si ho provato e funzionano entrambi...poichè so per certo che non avrò mai a che fare con molti record nella tabella da cui pesco mi affido all fill però è buono conoscere anche il metodo manuale..vi ringrazio per l'aiuto e per la prontezza nelle risposte!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5