Digitare dati su celle datagrid e salvare

venerdì 24 giugno 2005 - 10.15

ele Profilo | Newbie

Salve a tutti. Per caricare più records in un datagrid ho utilizzato la seguente routine, che passa i dati dal db ad un dataset pubblico:
Dim Csql As String
Dim dataset As Data.DataSet
Dim DataAdapter As OleDb.OleDbDataAdapter
Dim cnn As OleDbConnection = New OleDbConnection(StrConn)
Csql = "Select idtassanolo,anno,durata,prezzo,incremento,codicetassanolo from angTassanolo where codiceTassaNolo=" & LblCodice.Text & " and idazienda=" & IdAzienda & " and attivo=1"
DataGrid1.DataSource = (SelectOleDbSrvRows(StrConn, Csql, "angtassanolo").Tables(0))
La funzione SelectOleDbSrvRows è la seguente: (ds è un dataset pubblico)
Public Shared Function SelectOleDbSrvRows(ByVal myConnection As String, ByVal mySelectQuery As String, ByVal myTableName As String) As DataSet
Dim myconn As OledbConnection = New OledbConnection(StrConn)
myDataAdapter.SelectCommand = New OleDb.OleDbCommand(mySelectQuery, myconn)
myconn.Open()
ds = New DataSet
myDataAdapter.Fill(ds, myTableName)
myDataAdapter.Update(ds, myTableName)
myconn.Close()
Return ds
End Function
Questo mi permette di digitare i dati direttamente nelle celle del datagrid, ma poi non riesco a salvare nel database, poichè non riesco a reperire i nuovi dati appena inseriti. Utilizzo la seguente routine (che non funziona!):
Dim i As Integer
Dim csql As String
Dim Dbe As New sqlDBexe
Dbe.Connessione(StrConn)
'mettere i controlli sui campi numerici

For i = 0 To DataGrid1.VisibleRowCount - 2

csql = "Insert into angTassaNolo (IdAzienda, " _
& "CodiceTassaNolo, " _
& "Nome," _
& "Durata, " _
& "Anno, " _
& "Revisione, " _
& "Prezzo, " _
& "Incremento, " _
& "Attivo, " _
& "OpeA, " _
& "DataA, " _
& "OpeM, " _
& "DataM) values (" _
& IdAzienda & "," _
& LblCodice.Text & ",'" _
& LTrim(TxtNome.Text.Replace("'", "''")) & "','" _
& DataGrid1.Item(i, 2) & "','" _
& DataGrid1.Item(i, 1) & "'," _
& 1 & "," _
& CambiaMySql(DataGrid1.Item(i, 3)) & "," _
& "0," _
& "1," _
& USerID & ",'" _
& Format(MyData, "yyyy-MM-dd") & "'," _
& USerID & ",'" _
& Format(MyData, "yyyy-MM-dd") & "');"
Dbe.DB_execute(csql)
Next
DataGrid1.DataSource = Nothing
ds = Nothing
Dbe.Chiudi()
Qualcuno mi sa aiutare? Scusate per la lunghezza del messaggio....

totti240282 Profilo | Guru

hai provato con datagric.cell(coordinate riga,colonna )

Brainkiller Profilo | Guru

Ciao ele,
non funziona proprio così. Tu crei un DataSet proveniente dal database, chiudi la connessione e leghi (binding) il DataSet alla Datagrid. Naturalmente devi usare un DataAdapter.

Nel frattempo un utente inserisce nuovi dati o aggiorna quelli esistenti. Se tu chiami il metodo GetChanges() del DataSet otterrai l'elenco dei records aggiunti, eliminati o aggiornati. Devi poi utilizzare nuovamente il DataAdapter con il DataSet per aggiornare i dati sul Database.

Il Framework si preoccupa di creare le query opportune e di sincronizzare le modifiche.

ciao
david

6969 Profilo | Junior Member

Scusate, ho guardato attentamente il codice scritto da ele e le altre risposte, ma è da qualche giorno che non ottengo risultati.

partendo dal codice (ho tolto la funzione solo per semplicità)::

Dim myDataAdapter As System.Data.OleDb.OleDbDataAdapter
Dim dataset As System.Data.DataSet
conn = New System.Data.OleDb.OleDbConnection(strPercorsoDB)
conn.Open()
dataset = New System.Data.DataSet
myDataAdapter = New System.Data.OleDb.OleDbDataAdapter("Select * from table", conn)

myDataAdapter.Fill(dataset, "table")
myDataAdapter.Update(dataset, "table")
conn.Close()
DataGrid1.DataSource = dataset
DataGrid1.DataBind()

E così semplicemente visualizzo il dataGrid per visualizzare i dati collegati grazie al DataSet. La mia domanda: ele come fai a dare la possibilità di scrivere all'interno del DataGrid??

Ho provato anche ad utilizzare (come hai fatto ele) il SelectCommand del DataAdapter, ma oltre ad ottenere un errore ("System.NullReferenceException: Object reference not set to an instance of an object") mi sembra di capire che il SelectCommand serve ad aggiungere nuove tabelle o fonti di dati al DataSet creato, quindi non riesco a capire come 6 riuscito a dare la possibilità di scrivere all'interno delle celle del DataGrid..

grazie per qualsiasi consiglio
ciao
alessandro

ele Profilo | Newbie

Salve, grazie a tutti per i suggerimenti....in particolare mi è stato utile il metodo .AcceptChanges che ho utlizzato prima della insert.
In pratica ho solo aggiunto il comando ds.AcceptChanges() prima della insert into che ho riportato nel primo post. (Esattamente prima del ciclo for della insert).
Ora le modifiche fatte dall'utente vengono archiviate correttamente nel database e quindi ricaricate corrette nel datagrid quando riapro la form.
Grazie,
elena.

ele Profilo | Newbie

Ehm, dimenticavo....ho cambiato ovviamente anche la insert nel modo seguente:
Dim Dbe2 As New sqlDBexe
Dbe2.Connessione(StrConn)
'ds.GetChanges(DataRowState.Modified)
ds.AcceptChanges()

'For i = 0 To DataGrid1.VisibleRowCount - 2
For i = 0 To ds.Tables("angtassanolo").Rows.Count - 1
csql = "Insert into angTassaNolo (IdAzienda, " _
& "CodiceTassaNolo, " _
& "Nome," _
& "Durata, " _
& "Anno, " _
& "Revisione, " _
& "Prezzo, " _
& "Incremento, " _
& "Attivo, " _
& "OpeA, " _
& "DataA, " _
& "OpeM, " _
& "DataM) values (" _
& IdAzienda & "," _
& LblCodice.Text & ",'" _
& LTrim(TxtNome.Text.Replace("'", "''")) & "','" _
& ds.Tables("angtassanolo").Rows(i).Item("durata") & "','" _
& ds.Tables("angtassanolo").Rows(i).Item("anno") & "'," _
& 1 & "," _
& CambiaMySql(ds.Tables("angtassanolo").Rows(i).Item("prezzo")) & "," _
& "0," _
& "1," _
& USerID & ",'" _
& Format(MyData, "yyyy-MM-dd") & "'," _
& USerID & ",'" _
& Format(MyData, "yyyy-MM-dd") & "');"
Dbe2.DB_execute(csql)
Next
DataGrid1.DataSource = Nothing
ds = Nothing
Dbe2.Chiudi()
...forse non è il modo più elegante di risolvere il problema ma per ora funziona.
Volevo dire ad Alessandro che ha dichiarato il dataset dentro una routine mentre deve essere pubblico in un modulo. Non so, è l'unica differenza che vedo.


6969 Profilo | Junior Member

ele,
solo 1 cosa, tu sei riuscito a creare un dataGrid dove le singole celle sono modificabili? mi immagino, quindi, che nelle celle ci siamo delle TextBox opp. DropDownList, vero?



ele Profilo | Newbie

Veramente le celle mi compaiono cliccabili da subito nel datagrid; in asp.net invece è più complicato, bisogna inserire la textbox nella colonna modello..etc.
Per caricare il datagrid ho utilizzato le prime 7 righe del codice che ho inviato nel primo post...non so come mai non ti appaiano...


6969 Profilo | Junior Member

scusami,
ma cosa intendi per cliccabili, se tu clicci su una cella cosa ti compare? Penso, che ti compaia sempre un oggeto che ti consenta di scrivere in quella cella oppure cos'altro?
E dopo anche tu stai utilizzando asp.net!! Ho utilizzato la stessa logica del tuo codice (senza funzione..) Ma quello che ottengo è una DataGrid standar, dove le info sono solo visualizzate senza poterle modificare..
Cosa ne dici?
grazie
alessandro

ele Profilo | Newbie

Cliccabili non era la parola esatta, volevo dire editabili, in cui puoi scrivere e quindi modificare il contenuto.
Comunque io non sto realizzando un'applicazione Web con asp.net, ma un'applicazione locale in vb.net, in cui il datagrid ha un comportamento più elestico e il codice che ho scritto riguarda appunto un'applicazione locale.
Come ti dicevo, nelle applicazioni Web (Asp.net) le celle non sono editabili; bisogna inserire una colonna modello nel datagrid e poi (tasto destro sul datagrid, modifica modello) una textbox dentro itemtemplate.

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