26 messaggi dal 06 novembre 2001
Ciao a tutti,
nella mia applicazione al primo caricamento della pagina riempio un dataset tipizzato con i dati provenineti dal db.

In base ad alcuni eventi che si verificano nella pagina avrei bisogno di modificare alcuni valori presenti nel dataset (ma non cambiare i dati nel database di origine)

Pensavo che dopo aver riempito il dataset la prima volta, ad ogni postback della pagina il dataset fosse ancora visibile con tutti i dati dentro ma se controllo il numero di riche presenti in una tabella del dataset mi trovo sempre 0 e se rifaccio il databind senza ricaricare i dati dal db ovviamente il mio controllo non viene visualizzato perchè non ci sono più i dati nel dataset.

Cosa sbaglio?
E' normale che il dataset si svuoti al primo postback?
Non dovrebbe essere un modo per lavorare in modo disconnesso sui dati?

Vi prego di aiutarmi, non saprei come risolvere il problema diversamente
187 messaggi dal 28 gennaio 2002
Ad ogn ipostback la pagina viene ricreata da zero, quindi tutti valori delle variabili vengono resettati.
Per default tutte le pagine hanno la proprietà EnableViewState a True e questo ti consente di mantenere lo stato dei controlli tra postback.

Quando carichi i dati nella griglia assicurati di farlo solo la prima volta che carichi la pagina:

Sub Form_Load(....)
If Not Page.IsPostBack Then
' carica dati griglia
Ebd If
End Sub


Poi, assicurati di ricaricare i dati aggiornati nell'evento che scatena il postback. Ad esempio, se ha un pulsante che aggiorna i dati nel dataset avrai un codice simile a questo:

Sub Button1_Click(...)
' aggiornamento dato del dataset
' caricamento dei dati nella griglia
MiaGrid.DataSource = MioDataset
MiaGrid.DataBind()
End Sub


Il principio fondamentale è sempre lo stesso: ad ogni postback la pagina viene ricreata ex-novo. Inoltre tieni presente che se il tuo dataset è particolarmente grande questo rallenterà il download della pagina perchè conterrà tutti i dati nel campo nascosto del ViewState (secondo la logica del viewstate di ASP.NET)

Ciao
Modificato da tdj il 03 febbraio 2005 13.37 -

blog: http://community.visual-basic.it/tdj
26 messaggi dal 06 novembre 2001
fino a qui tutto ok.
il mio problema non è la riassociazione dei dati del dataset alla griglia quanto il fatto che il dataset si svuota ogni volta che faccio il postback e quindi l'evento che va a lavorare sul dataset trova il dataset vuoto...

sono riuscito a spiegarmi meglio?
per avviare il problema inserisci nella chache il dataset

context.Cache["key"] = valore;

su aspitalia ci sono molti articoli al riguardo, in pratica puoi creare il tuo dataset al primo caricamento della pagina, al caricamento dell'applicazione, insomma quando ritieni opportuno e poi accervi invece di rieseguire nuove query sul db

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
187 messaggi dal 28 gennaio 2002
Il Dataset no si svuota da solo. Verifica bene l'iter di caricamento della tua griglia (e quindi del dataset).
Devi trovare la parte di codice che carica il tuo dataset e vedere in quale punto della pagina viene richiamato.
Con il debug dovresti trovare il problema immediatamente.

Se posti un po' di codice magari è meglio
Ciao

blog: http://community.visual-basic.it/tdj
26 messaggi dal 06 novembre 2001
il codice della onload è il seguente:

Public Dataset11 As DataSet1 = New DataSet1
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

If Not Page.IsPostBack Then
Dim list As Listino_DB = New Listino_DB
Dim myConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
Dim myCommand As SqlCommand = New SqlCommand("Listino_Sport", myConnection)
myCommand.CommandType = CommandType.StoredProcedure
' AGGIUNGO I PARAMETRI
Dim parametro1 As SqlParameter = New SqlParameter("@lingua", SqlDbType.NVarChar, 50)
parametro1.Value = "Italiano"
myCommand.Parameters.Add(parametro1)
Dim parametro2 As SqlParameter = New SqlParameter("@sport", SqlDbType.Char, 2)
parametro2.Value = "VO"
myCommand.Parameters.Add(parametro2)

Dim SqlDataAdapter1 As SqlDataAdapter = New SqlDataAdapter
SqlDataAdapter1.SelectCommand = myCommand
SqlDataAdapter1.TableMappings.Add("Table", "ClassiProdotti_Tipo")
SqlDataAdapter1.TableMappings.Add("Table1", "Pacchetti_Tipo")
SqlDataAdapter1.TableMappings.Add("Table2", "Descrizioni_Pacchetti")
SqlDataAdapter1.MissingSchemaAction = MissingSchemaAction.Add
SqlDataAdapter1.MissingMappingAction = MissingMappingAction.Passthrough

Dim DataSet_Listino As DataSet1 = New DataSet1
SqlDataAdapter1.Fill(Dataset11)
dlTipo_Classe.DataSource = Dataset11
dlTipo_Classe.DataMember = "ClassiProdotti_Tipo"
dlTipo_Classe.DataBind()
End If
End Sub


una volta riempito il datalist chiamato dlTipo_Classe intercetto l'evento di selezione di una checkbox scrivendo una procedura che mi deve ricalcolare i valori interni al mio dataset chiamato Dataset11

di seguito riporto il codice di questa procedura

Protected Sub selezione_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles selezione.CheckedChanged

Dim cb As Web.UI.WebControls.CheckBox
Dim i
cb = sender
Dim lbID_corrente, lbImporto_corrente As Web.UI.WebControls.Label
lbID_corrente = CType(cb.NamingContainer.FindControl("labelID"), Web.UI.WebControls.Label)
lbImporto_corrente = CType(cb.NamingContainer.FindControl("Label_Importo"), Web.UI.WebControls.Label)
Dim ID_temp As Integer = 0
Dim prezzo_temp As Decimal = 0
Dim prezzo_tot As Decimal = 0

For i = 1 To DataSet11.Tables(2).Rows.Count
If DataSet11.Descrizioni_Pacchetti.Rows(i).Item("ID_Pacchetto") = CInt(lbID_corrente.Text) Then
If cb.Checked Then
DataSet11.Descrizioni_Pacchetti.Rows(i).Item("Selezionato") = True
Else
DataSet11.Descrizioni_Pacchetti.Rows(i).Item("Selezionato") = False
End If
End If

If DataSet11.Descrizioni_Pacchetti.Rows(i).Item("Importo") > prezzo_temp Then
If DataSet11.Descrizioni_Pacchetti.Rows(i).Item("Selezionato") Then
prezzo_temp = DataSet11.Descrizioni_Pacchetti.Rows(i).Item("Importo")
ID_temp = DataSet11.Descrizioni_Pacchetti.Rows(i).Item("ID_Pacchetto")
End If
End If
Next
dlTipo_Classe.DataBind()
End Sub

purtroppo però quando dopo aver selezionato la checkbox che mi genera il postback e l'evento sopra descritto il dataset e nello specifico For i = 1 To DataSet11.Tables(2).Rows.Count
mi risulta uguale a 0 ossia non ci sono righe.

Anche secondo me non dovrebbe svuotarsi il data set altrimenti che senso hanno tutti i discorsi sui dati disconnessi dal db gestibili con il dataset? sono un neofita se non si era capito ma ho bisogno di una soluzione pulita.

Grazie ancora per la disponibilità
per sua natura il web è stateless, per ovviare a questo problema ci sono diversi modi, viewstate, session, cache application.

quando richiedi una pagina questa viene eseguita, vengono creati gli oggetti, le varibili ecc ecc

il tuo DataSet viene creato solo se la richiesta non è dovuta ad un postback "If Not Page.IsPostBack" alla prima esecuzione tutto procede liscio, il problema sorge quando la pagina viene richiesta a causa di un postback.

il DataSet che hai creato nella richiesta precedente, con tutta probabilità è andato in pasto al garbage collector, visto che non risultava più utilizzato.

per non essere costretti a ricreare il DataSet dovresti salvarlo in cache, qualcosa del degenere

Cache.Add("mioDS", Dataset11)

dopodiche lo recuperi dalla cache nella tua funzione selezione_CheckedChanged

se hai dei dubbi non esitare a chiedere

ciao marco

p.s. il discorso su i dati disconessi, in pratica vuol dire che puoi manipolare un oggetto che è una representazione disconnessa di una o pià tabelle del db, ma solo se questo è in memoria :)

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
187 messaggi dal 28 gennaio 2002
Solo una precisazione su quanto detto da nostromo.

Il dataset lo perdi perchè viene ricreato ad ogni postback (in quanto campo pubblico della classe) ma non riempito (infatti lo fai solo la prima volta che carichi la pagina)

La cache va bene se i dati non dipendono dall'utente connesso, perchè l'oggetto Cache() è generico, cioè vale per tutti gli utenti connessi (un po' come l'oggetto Application)

Ciao

blog: http://community.visual-basic.it/tdj

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.