DataSource per gridview

lunedì 27 dicembre 2010 - 13.22
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows Vista  |  Visual Studio 2008  |  SQL Server 2008  |  Office 2007  |  Firefox

stellare21 Profilo | Newbie

ciao a tutti e visto il periodo, buone feste!
Ho un problema, sto cercando di creare un catalogo on-line, ho realizzato una pagina dove grazie a una gridview e un datasource riesco a inserire nella tabella tutte le categorie dei prodotti, ora devo poter scendere nel dettaglio, ho fatto in modo che al click sul hyperlink della gridview nella barra dell'indirizzo io mi ritrovi il valore che mi occorre per poter effettuare la query.
Adesso nella pagina che ho creato per scendere nel dettaglio ho inserito un'altra gridview, ma dovrei associare ad esso un datasource (che effettua una query prendendo tramite una querystring il valore) da inserire nel page load della pagina aspx.cs, ma come devo fare per crearlo in c#?
suggerimenti? Alternative? grazie ciao!

paoval72 Profilo | Senior Member

Ciao. le soluzioni che mi vengono in mente sono due.
1) Se vuoi fare una nuova chiamata al Db, lo fai con una select attraverso un command e un dataadapter.
Ad esempio:
//preparo la mia query col valore del querystring string query ="Select * from mia_tabella where id_mio =" Request.QueryString["mio_valore"]; SqlConnection conn = new SqlConnection(); //creo la mia connessione al db coi suoi parametri conn.ConnectionString = ....................; //passo al mio command la connessione e la select SqlCommand sqlcm = new SqlCommand(query , conn); //preparo il dataset che ospiterà i dati della mia query DataSet ds = new DataSet(); //apro la connessione conn.Open(); //creo il mio dataadapter che riempirà il dataset SqlDataAdapter da = new SqlDataAdapter(); //gli associo il mio command da.SelectCommand = sqlcm; //eseguo e riempio il mio dataset, che posso chiamare come voglio da.Fill(ds, "prova"); //chiudo la connessione conn.Close();
A questo punto hai un dataset che in teoria dovrebbe contenere solo la riga che hai selezionato.
Poi, passi il dataset come datasource della gridview e fai il databind

2) Se non vuoi fare una nuova chiamata, c'è la possibilità di mettere i dati della riga selezionata in Session, ma è rischioso (per motivi di sicurezza) e non viene molto consigliato

stellare21 Profilo | Newbie

Grazie paoval, scusami ma sono alle prime armi, c'è ancora qualcosa che non mi è chiara praticamente alla gridview devo passargli il dataset?
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

fatto questo nel markup ho la gridview con questa impostazione?
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" DataKeyNames="id" DataSourceID="ds" ForeColor="Black" GridLines="Vertical"> <Columns> <asp:BoundField DataField="tipologia" HeaderText="tipologia" SortExpression="tipologia" /> <asp:BoundField DataField="id" HeaderText="id" ReadOnly="True" SortExpression="id" /> <asp:BoundField DataField="attacco" HeaderText="attacco" SortExpression="attacco" /> </Columns> <FooterStyle BackColor="#CCCCCC" /> <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" /> <AlternatingRowStyle BackColor="#CCCCCC" /> </asp:GridView>

dove sbaglio?

paoval72 Profilo | Senior Member

Mi sembra tutto corretto, dovresti togliere il campo dataSourceID perchè di solito si usa con i sqldatasource. In questo caso, basta il bind che fai da codice:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" DataKeyNames="id" ForeColor="Black" GridLines="Vertical">


Prova e fammi sapere.

Ciao!

stellare21 Profilo | Newbie

ma perchè mi dice che il nome GridView1 non esiste nel contesto corrente, quando è l'id della gridview?

paoval72 Profilo | Senior Member

Forse mi sono perso qualcosa, 8 ore a pc fanno di questi effetti!
Ricapitoliamo. Tu hai la pagina 1 dove c'è il gv1. Clicchi su una riga e cosa dovrebbe accadere?
Per il dettaglio della riga fai una redirect ad un'altra pagina, dove c'è un gv2? Oppure vuoi gestire tutto nella stessa pagina, ma con un altro gv?

Comunque, ha salvato il progetto e hai rigenerato il progetto?

stellare21 Profilo | Newbie

ciao paoval72 grazie per l'aiuto sono andato un pò avanti cercando di capire tutte le info che ho trovato in rete, praticamente devo permettere di sfogliare un catalogo di prodotti, al primo click si va nella pagina 1 dove c'è una gridview1 con le principali categorie al click su una delle categorie devo poter scendere nel dettaglio, quando clicco cioè devo aprire una pagina2 dove c'è una gridview2 popolata in base alla scelta fatta nella precedente pagina.
Sono arrivato a scrivere questo, ma se lo do in pasto al compilatore mi da l'errore che ti posto subito sotto:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Dichiarare la variabile scalare "@inserto".
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.Data.SqlClient.SqlException: Dichiarare la variabile scalare "@inserto".

Errore nel codice sorgente:

Riga 31: SqlDataAdapter da = new SqlDataAdapter(comm.CommandText, conn);
Riga 32: conn.Open();
Riga 33: da.Fill(ds, "prova");
Riga 34: conn.Close();
Riga 35: GridView1.DataSource = ds.Tables[0];

paoval72 Profilo | Senior Member

Se hai un parametro da passare, dobbiamo modificare l'utilizzo del dataadapter o passare al datareader.
Prima proviamo a riprendere il nostro dataadapter:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
La connessione è già insita nel command. Quindi, quando si richiama il dataadapter basta passargli il command. Per coerenza il dbtipe l'ho trasformato in SqlDbType (e come tipo NvarChar, che è la stringa più grande che esista), ma dovrebbe funzionare anche col generico DbType.
Prova e fammi sapere.

Ciao,
PV

stellare21 Profilo | Newbie

grazie per l'aiuto, Grazie per l'aiuto Daniel, ho risolto in questo modo e funziona, ho notato che non mi risolveva la querystring passandogli l'indice invece che il nome ha funzionato:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5