[VB] Problemi per aggiungere riga in Dataset tipizzato

mercoledì 14 gennaio 2009 - 11.55

samar Profilo | Senior Member

Ciao a tutti, ho la seguente situazione:
ho creato un dataset tipizzato con una datable e l'ho collegata ad una gridview,tutto questo perchè devo poter lavorare sui campi della grid senza toccare il db e poter utilizzare il viewstate dei controlli server, per questo sto provando ad utilizzare appunto i dataset.
Nella pagina che contiene questa grid l'utente potra solamente modificare i dati già presenti attraverso alcune DDL e aggiungere altre righe che conterranno a loro volta altre DDL, veniamo al problema:

nel cercare il modo di aggiungere una riga al dataset mi sono incappato in una pagina MSDN con il seguente codice:

Dim newCustomersRow As NorthwindDataSet.CustomersRow newCustomersRow = NorthwindDataSet1.Customers.NewCustomersRow() newCustomersRow.CustomerID = "ALFKI" newCustomersRow.CompanyName = "Alfreds Futterkiste" NorthwindDataSet1.Customers.Rows.Add(newCustomersRow)

ma nn riesco a riportarlo nel mio caso in quanto nel mio dataset non ritrovo i metodi descritti sopra.
qualcuno può aiutarmi?
GRAZIE!!!

Jeremy Profilo | Guru

>Dim newCustomersRow As NorthwindDataSet.CustomersRow
>newCustomersRow = NorthwindDataSet1.Customers.NewCustomersRow()
>
>newCustomersRow.CustomerID = "ALFKI"
>newCustomersRow.CompanyName = "Alfreds Futterkiste"
>
>NorthwindDataSet1.Customers.Rows.Add(newCustomersRow)

Cosa non trovi???? CustomersRows????E' normale.....se nel tuo dataset non hai la tabella Customers
Il dataset lo crei con il Wizard???Se si, se nel tuo dataset hai la datatable pippo, avrai pippoRows....
se invece fai tutto da codice, allora posta un po di codice in più......che si vede come aiutarti.
Altrimenti fatti risentire.

Ciao.

samar Profilo | Senior Member

No no chiaramente non cerco North.... ho il mio dataset con una datatable...
cerco di riportare la procedura nel mio codice, ma nn riesco a ritrovare la 2° e l'ultima riga in quanto l'intellisense nn me ne da l'opportunità
posto uno screenshot:

775x393 53Kb


Il dataset si chiama SoggettiDataSet e la dt Soggetti


Jeremy Profilo | Guru

Prova un pò......
newSoggettiRow = SoggettiDataSet.SoggettiDataTable.NewSoggettiRow()


samar Profilo | Senior Member

ehh troppo facile

mi dà l'errore su quella riga:

"Il riferimento a un membro non condiviso richiede un riferimento a un oggetto."


avrò dimenticato qualcosa da qualche parte...

Jeremy Profilo | Guru

senti...facciamo una cosa.
Io non sono abituato a lavorare con il wizard.
Dammi un po di tempo che faccio due prove....poi ti dico.

samar Profilo | Senior Member

tutto il tempo che vuoi troppo gentile!

Jeremy Profilo | Guru

Per forza....se usiamo SoggettiDataSet in quanto tipo.
Dobbiamo crearne un'istanza
quindi sarà

Dim newSoggettiRow As SoggettiDataSet.CustomersRow
dim ds as new soggettidataset
newsoggettiRow = ds.soggetti.NewsoggettiRow()

samar Profilo | Senior Member

Alla fine viene così:


Dim newSoggettiRow As SoggettiDataSet.SoggettiRow Dim ds As New SoggettiDataSet newSoggettiRow = ds._Soggetti.NewSoggettiRow() newSoggettiRow.id_prestazione = "118" newSoggettiRow.id_struttura = "1" newSoggettiRow.id_cliente = "1" newSoggettiRow.id_percontodi = "1" newSoggettiRow.id_destinatario = "1" ds._Soggetti.Rows.Add(newSoggettiRow)

ma mi potresti spiegare come mai devo mettere "_Soggetti" invece di "Soggetti" per il nome della dt????
per vedere se funziona il tutto mi ci vuole un pò, ti farò sapere...x ora mille grazie!!!!


--Edit--
no...c'è qualcosa che nn va....
non riesco a capire perchè facendo il databind della gridview non ottengo nessun risultato, ho provato a farlo anche all'ObjectDataSource al quale è collegata la grid ma niente...

Jeremy Profilo | Guru

Scusa ...sono tornato solo ora.....

Spiega bene qual'è il tuo scopo.
E, se ti serve, ti mando un progettino di esempio commentato.

samar Profilo | Senior Member

In pratica devo visualizzare dei valore presenti in un db e per questo uso la gridview, dopodichè devo poter modificare e creare nuovi record senza modificare il db e per questo ho pensato di collegare la grid ad una datatable...


830x289 24Kb


l'eliminazione e il salvataggio delle modifiche e dei record nuovi saranno gestiti alla fine del wizard...
ho preferito usare controlli server e non js per poter sfruttare il viewstate.
Solo che ora sono incappato appunto nella gestione dei nuovi record....

Jeremy Profilo | Guru

Dammi un po di tempo.....stasera imposto il codice e te lo mando commentato.
Io, però, ho l'abitudine di non usare il Wizard(dovresti farlo anche tu) perchè il wizard ti crea del codice automaticamente, sicuramente funzionante, ma tu non sai perchè.

samar Profilo | Senior Member

Eh lo so, è la prima volta che lo uso, per causa di forza maggiore, e mi sono già accorto che sono + le rogne che i benefici...
ti ringrazio per tutto l'aiuto!!!!

Jeremy Profilo | Guru

Shared ds As New DataSet
Shared conn As OleDb.OleDbConnection
Shared dt As New DataTable
Shared newdatarow As DataRow

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
conn = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= |DataDirectory|\Database.mdb;")
Dim objCmd As New OleDb.OleDbCommand
objCmd.Connection = conn
objCmd.CommandText = "SELECT * FROM Tabella1"
Dim da As New Data.OleDb.OleDbDataAdapter(objCmd)
da.Fill(ds, "ComeVuoiChiamareLaTabellaNelDataset")
dt = ds.Tables(0)
GridView1.DataSource = dt
GridView1.DataBind()
da.Dispose()
objCmd.Dispose()
End Sub

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
newdatarow = dt.NewRow
newdatarow.Item("IdCampo") = "3"
newdatarow.Item("Campo1") = "Prova3"
newdatarow.Item("Campo2") = "Prova3"
dt.Rows.Add(newdatarow)
GridView1.DataSource = dt
GridView1.DataBind()
End Sub


Prova questo codice..... giusto per capire se è quello che vuoi.
Se dovesse andare bene, te lo commento ed eventualmente lo perfezioniamo in base alle tue esigenze.

Per farlo funzionare devi inserire nella WebForm una gridview e 2 bottoni.
il Database chiamato appunto "Database", è in AppPath.
Nel Db crea una tabella "Tabella1" con 3 campi "IdCampo", Campo1 e Campo2.

Se è quello che vuoi, lo perfezioniamo.
Ciao.

samar Profilo | Senior Member

Ciao, ti ringrazio già per lo sbattimento,
ho visto il tuo codice e direi che mi è abbastanza chiaro, provo a riportarlo nella mia situazione (bind della grid nel pageload,db mysql,ddl nei campi del grid,etc) e ti faccio sapere....ancora grazie!!!!

--Edit--
Ok funziona tutto, mi rimane il problema che quando aggiungo una riga invece di aggiungere solo una nuova riga mi aggiunge quella e prima ancora le righe che vengono caricate dal db,questo anche per successive aggiunte...

Jeremy Profilo | Guru

E' normale.....perchè tu hai messo il codice di popolamento del dataset....nell'evento PageLoad....lascio intendere a te il motivo...visto che sicuramente sei più pratico di me nelle applicazioni Web.

Ciao

samar Profilo | Senior Member

>che sicuramente sei più pratico di me nelle applicazioni Web.
eh si come no....

avevo intuito che il problema fosse li ma facendo delle prove e praticamente mettendo quel codice ovunque non riesco a evitarlo...
in teoria deve farlo solo una volta quindi l'ho messo nel pageload dopo il controllo sul postback ma niente..

Jeremy Profilo | Guru

Il problema, stà nel fatto che, e qui lascio le spiegazione a chi è più esperto di me, ad ogni evento, viene ricaricata la pagina, quindi......se nella PageLoad metti il codice per il ripopolamento del dataset, si verifica quanto hai lamentato.

Se il popolamento del dataset, lo metti invece nell'evento Click di un bottone(come ho fatto io), o comunque impostando una variabile booleana qualora il popolamente fosse già stato fatto, questo non succede.

Se hai ancora proplemi provo a pubblicare il risultato del codice che ho scritto io e poi ti passo l'url, perchè magari non ho capito io e stiamo pensando a due cose diverse!!

Ciao


samar Profilo | Senior Member

Non saprei proprio come comportarmi, perchè la soluzione del bottone in questa situazione è improponibile, potrei collegarlo al click della voce di menu del wizardstep rispettivo ma mi sa che mi complico la vita, credo che proverò con la variabile anche se mi sembra una soluzione poco elegante

ti ringrazio ancora e spero di poter ricambiare un giorno

Jeremy Profilo | Guru

Scusa....ma invece della variabile potresti controllare se la table del dataset è nothing oppure no.

If not ds.tables(0) is nothing then
exit sub
else
popoladataset
endif


ciao


edit

con il codice sopra avresti ricevuto un eccezione....

If not ds is nothing then
exit sub
else
popoladataset
endif



samar Profilo | Senior Member

Peccato con la variabile funzionava
ho provato con il tuo codice (ho tolto il NOT dall'if perchè era doppia negazione...) e funziona anche lui,
xò adesso, ma credo anche prima, succede una cosa + sfiziosa da risolvere, quando esco dalla pagina che ospita la grid e poi ci ritorno la dt è sempre popolata dalle righe che sono state aggiunte precedentemente e nn salvate sul db, ho provato a mettere nell'unload dt.Dispose() ma niente...

Jeremy Profilo | Guru

>ho tolto il NOT dall'if perchè era doppia negazione
hai ragione


>la dt è sempre popolata dalle righe che sono state aggiunte precedentemente e nn salvate sul db

Sei sicuro il problema sia nella dt????.....prova a fare un databind della grglia nel load della pagina e, comunque, nell'unload distruggi sia la dt che il ds.

Ciao

samar Profilo | Senior Member

Rieccomi...mi sono bloccato sul fatto che le dt mantengono le "vecchie" righe, ho risolto qualcosina praticamente creando una dt univoca ogni volta che richiamo la pagina, in questo modo visualizzo sempre (per lo meno all'inizio) i dati iniziali in modo corretto, ma ora ho notato che le ddl nn mantengono lo stato sfogliando il wizard, cosa che invece prima facevano...
nel page_unload mi sa che è meglio nn mettere niente...
hai qualche consiglio?????

Jeremy Profilo | Guru

>ma ora ho notato che le ddl nn mantengono lo stato sfogliando il wizard, cosa che invece prima facevano...

Non capisco....il wizard, in questo caso, non c'entra nulla....cosa intendi?

samar Profilo | Senior Member

ho notato che sfogliando il wizard le ddl nella gridview nn mantengono la selezione, credo per il fatto che sfogliando il wiz venga chiamata la page_load e rivenga bindato il grid con dt...
ho praticamente messo le porzioni di codice del popolamento ovunque...anche a caso!!!!...ma niente
che casino!!!
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