GridView e campi Tabella

venerdì 14 settembre 2007 - 17.40

gae58 Profilo | Senior Member

salve,

un consiglio, ho una gridView con la select e devo usare alcuni dati della RIga Scelta.
Ho notatao che se nella grid non è presente il campo che mi serve non lo posso usare.

C'è un modo per collegare la scelta effettuata tramite il gridView_SelectedIndexChanged ai campi della Tabella, senza però il dataSet utilizzando SqlDataSource?

Oppure mi conviene inserire a non visibile i campi della tabella che mi servono ed utilizzare così i campi?

grazie


Gaetano

freeteo Profilo | Guru

ciao,
per questo tipo di problematiche c'e' la proprieta' "DataKeyNames"della gridview che fa proprio questo, ovvero gli dici qual'e' il tuo campo (o anche campi) "identificativo" anche se non lo visualizzi nella griglia...
Prova in questa strada, se vuoi qualche dettagli in piu':
http://msdn2.microsoft.com/it-it/library/system.web.ui.webcontrols.gridview.datakeynames.aspx
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

ciao ti ringrazio per la segnalazione.

Ho letto il link, ma non funziona. Nel senso che dataKeyName, dovrebbe servire per i campi che compongono l'indice.

Ho provato a mettere a false sia la colonna di PRogressivo che è la chiave primaria:
DataKeyNames="Progressivo" e nel GridView1_SelectedIndexChanged ho inserito il comando:
TextBox1.Text = GridView1.SelectedRow.Cells[1].Text;
ma non funziona.

Ho provato anche con:
DataKeyNames="Progressivo, Cronologia", ma fa lo stesso.

Qualche altro suggerimento?

Tu come fai a leggere i campi di una tabella attraverso il gridView?


Gaetano

freeteo Profilo | Guru

ciao,
io ho usato anche codice di questo tipo:


nella pag aspx:
----------------------

<asp:GridView ID="GridView1" runat="server" DataSourceID="AccessDataSource1" DataKeyNames="id" onselectedindexchanged="GridSelectedIndexChanged" > <Columns> <asp:ButtonField CommandName="Select" Text="Seleziona" /> <asp:BoundField DataField="testo" HeaderText="testo" /> <asp:BoundField DataField="numero" HeaderText="numero" /> </Columns> </asp:GridView> <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/App_Data/db1.mdb" SelectCommand="SELECT * FROM [tabprova]"> </asp:AccessDataSource>

e nell'evento "SelectedIndexChanged" che ho agganciato alla griglia:
protected void GridSelectedIndexChanged(object sender, EventArgs e) { Response.Write( "hai selezionato la riga: " + GridView1.SelectedDataKey["id"].ToString()); }
e non ho avito problemi a recuperare il valore del campo che fa parte di quella riga e che ho mappato essere il mio campo chiave...

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

ti ringrazio della risposta, l'ho provato e funziona.

Nel selectIndex non avevo inserito la riga che mi hai segnalato. Scusa se non l'ho capito.

Non so se questa soluzione sia valida qualora ci fossero parecchi campi da dover prendere.

Tu che ne pensi?

Non c'è un modo simile per leggere direttamente la tabella?

grazie


Gaetano

freeteo Profilo | Guru

ciao,
si diciamo che quella tecnica è per lavorare con un campo identificativo del record, se vuoi avere accesso alle righe e le relative cella la datagrid espone le proprieta' relative:

Per esempio, nel caso di prima quando ti selezionano una riga ricavi i dati che ti servono in questo modo:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { GridView1.Rows[1].Cells[1].Text...

è questo che stavi cercando?
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

preciso che uso una gridView, non so se sia uguale al dataGrid.

Si quello che voglio fare è quello che hai detto tu. L'unica cosa è che non ci riesco. L'esempio che mi hai postato l'avevo già letto da qualche parte, ma non mi funzionava.
L'ho Inserito nel:
gwLicenze_SelectedIndexChanged(object sender, EventArgs e)
{
Response.Write(gwLicenze.Rows[gwLicenze.SelectedIndex].Cells[3].Text);
}

ma quando inserisco una cella che non è presente nella gridView, mi da' errore indicandomi che il valore è fuori del range.

Per quel che ho letto e mi è stato detto dovrei usare un dataTable, però a questo punto perdo i benefici dell'SqlDAtaSource.

Tu che ne pensi?


Gaetano

freeteo Profilo | Guru

>preciso che uso una gridView, non so se sia uguale al dataGrid.
l'esempio mio era con gridview


>Si quello che voglio fare è quello che hai detto tu. L'unica
>cosa è che non ci riesco. L'esempio che mi hai postato l'avevo
>già letto da qualche parte, ma non mi funzionava.
>L'ho Inserito nel:
>gwLicenze_SelectedIndexChanged(object sender, EventArgs e)
> {
>Response.Write(gwLicenze.Rows[gwLicenze.SelectedIndex].Cells[3].Text);
>}
>
>ma quando inserisco una cella che non è presente nella gridView,
>mi da' errore indicandomi che il valore è fuori del range.
è chiaro che se la cella non c'e' da errore

Forse il tuo problema va risolto in un'altro modo, ovvero pensando a qualcosa di master-details, ovvero nella griglia visualizzi i dati principali che ti servono e poi quando ti selezionano la riga visualizzi tutta una serie di altri dati che ha senso essere visibili solo quando l'utente ha fatto una scelta.
Questa funzionalita' la da il "detailsView" che nasce proprio per questo tipo di scenario.Lo leghi alla priam griglia in modo da poter fare tutto a design come trovi spiegato in questo link:
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/detailsview.aspx
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

gae58 Profilo | Senior Member

ti ringrazio per la spiegazione, ma la mia necessità è proprio questa.

Per il detailsView l'ho utilizzato e va bene, ma all'atto della scelta (nella gridView), devo personalizzare la pagina che contiene alcuni linkButton con i valori del campo della riga che è stata scelta ed il detaiulsview non mi serve.

Siccome questi valori all'utente non serve vederli, non li inserisco o li nascondo.

Con la soluzione che mi hai dato precedentemente, selectDataKeyName, riesco a fare quello che voglio.

Probabilmente la possibilità di leggere la tabella ci sarà anche con l'SqlDataSource, chissa se si può referenziare il dataTable direttamente dall'SqlDataSource.

Ti ringrazio per l'aiuto e se hai qualche altro suggerimento mi fa piacere.

grazie

Gaetano

freeteo Profilo | Guru

>Probabilmente la possibilità di leggere la tabella ci sarà anche
>con l'SqlDataSource, chissa se si può referenziare il dataTable
>direttamente dall'SqlDataSource.
si puoi sempre farti tornare i dati usando anche oggetti di accesso ai dati "preconfezionati", invocando i metodi relativi (select Update etc...) ad esempio puoi fare:

IEnumerable dati = tuaSqlDataSource1.Select(new DataSourceSelectArguments());
e lavorare con quelli se ti servisse...


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5