GridView + SqlDataSource, cambio query dinamico

venerdì 27 marzo 2009 - 21.17

tabache Profilo | Newbie

Salve,
premetto che ho appena iniziato a utilizzare questa piattaforma.
Uso Visual web Developer 2008.
ho una oggetto SqlDataSource che effettua una query su un database e restituisce il risultato in una GridView.

Vorrei che alla selezione di un certo indice di un RadioButton si cambi la query definita all'interno del SqlDataSource e questo son riuscito a farlo, ma non riesco a modificare le colonne del GridView in base alla nuova query.

La ho pensata così:
la tabella è composta da due colonne, nella nuova query avrò sempre due colonne, ma come seconda colonna una dal nome "tipo" invece che "sito". Quindi eliminerei la seconda colonna e ci inserirei una nuova colonna dal nome "tipo".

Ecco il codice che ho inserito nel selezionare un dato indice di un radioButton:

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

nella penultima riga mi restituisce il seguente errore: "Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme."

Come posso fare ad aggiornare correttamente la GridView con le nuove colonne a runtime?

Francesco

LuxSkyWalker Profilo | Junior Member

Le colonne della gridview non sei obbligato a definirle prima...lascia la gridview vuota, e la popoli dinamicamente in base alla query...il nome delle colonne lo definisci direttamente nella query:

ES.

SELECT a.Cogn as Cognome, a.Nome as Nome,
FROM anagrafica a
Where...

Avrai una gridview con 2 colonne...COGNOME e NOME...

Spero di aver capito bene il tuo problema e di esserti stato di aiuto!
LuxSkyWalker
Junior Developer .NET

tabache Profilo | Newbie

mmm.. ook posso provare anche a iniziare così (anche se ho paura che dopo il problema rimane). Comunque come faccio? io ho provato a fare così:

la query che popola la tabella è definita nell'oggetto SqlDataSource (SELECT sito, COUNT(*) AS Score FROM siti_censurati GROUP BY sito ORDER BY sito DESC).

ho messo a false la proprieta AutoGenerateColumns nel GridView.

E nell'evento di inizializzazione della GridView ho scritto questo:
protected void GridViewSitiProvati_Init(object sender, EventArgs e)
{
string strQuery;
DataControlField dcfNuovaColonna;
DataControlField dcfNuovaColonna2;
dcfNuovaColonna = new BoundField();
dcfNuovaColonna2 = new BoundField();

dcfNuovaColonna.AccessibleHeaderText = "tipo";
dcfNuovaColonna.Visible = true;
dcfNuovaColonna.HeaderText = "tipo";

dcfNuovaColonna2.AccessibleHeaderText = "Score";
dcfNuovaColonna2.Visible = true;
dcfNuovaColonna2.HeaderText = "Score";

GridViewSitiProvati.Columns.Add(dcfNuovaColonna2);
GridViewSitiProvati.Columns.Add(dcfNuovaColonna);

GridViewSitiProvati.DataBind();
}

Il risultato che ottengo è la tabella con si le due colonne (Score e tipo), ma senza elementi dentro, si vedono tre righe (come è giusto che siano), ma sono vuote!

LuxSkyWalker Profilo | Junior Member

Mmh...
Ho lottato la scorsa settimana con il tuo stesso problema, e l'ho risolto esattamente come ti ho detto...
ma non ho usato la init per la grid ma ho fatto tutto nel page_load, dal momento che a me serviva la grid piena appena accedevo alla pagina...e soprattutto ho messo la autogeneratecolumn a true, non a false!!!

Hai fatto il databind vero?
Puoi postarmi un po di codice in modo che capisca bene il tuo problema?
LuxSkyWalker
Junior Developer .NET

tabache Profilo | Newbie

A no scusa, non guardare il mio ultimo post. Mi sa che non avevo capito quello che mi dicevi.

Ma la mia tabella si genera bene con autogeneratecolumn a true.

Il mio problema è molto semplice: ad un certo evento (es. pressione di un bottone), cambio la query all'interno dell'oggetto SqlDataSource... quindi assegnando una nuova stringa con la nuova query alla sua proprietà "SelectCommand" (si fa così no?).

Solo che nella mia nuova select seleziono delle colonne diverse. Come faccio ad aggiornare la GridView? (attualmente mi da errore)
A me sembra di perdermi in una cavolata.
Dite che è meglio usare un altro tipo di DataControl (al posto del SqlDataSource) ?

LuxSkyWalker Profilo | Junior Member

>A no scusa, non guardare il mio ultimo post. Mi sa che non avevo
>capito quello che mi dicevi.
>
>Ma la mia tabella si genera bene con autogeneratecolumn a true.
>
>Il mio problema è molto semplice: ad un certo evento (es. pressione
>di un bottone), cambio la query all'interno dell'oggetto SqlDataSource...
>quindi assegnando una nuova stringa con la nuova query alla sua
>proprietà "SelectCommand" (si fa così no?).
ESATTO.
>Solo che nella mia nuova select seleziono delle colonne diverse.
SE SELEZIONI COLONNE DIVERSE NON CAMBIA NULLA.
E' LA QUERY CHE POPOLA LA GRIGLIA.
>Come faccio ad aggiornare la GridView? (attualmente mi da errore)
SI DOVREBBE AGGIORNARE DA SOLA UNA VOLTA ESEGUITA LA QUERY E RENDERIZZATA LA PAGINA.
>A me sembra di perdermi in una cavolata.
PROBABILE.
>Dite che è meglio usare un altro tipo di DataControl (al posto
>del SqlDataSource) ?
IO HO SEMPRE USATO SQLDATASOURCE E NON HO MAI AVUTO PROBLEMI.

TI SPIACE MANDARMI UN PO' DI CODICE (DOVE VA IN ERRORE!) COSI POSSO VALUTARE MEGLIO?

A DISPOSIZIONE!
LuxSkyWalker
Junior Developer .NET

tabache Profilo | Newbie

si infatti, non so che cavolo di viaggio mi son fatto

mi vergogno quasi, boh funziona perfettamente, non so che cavolo avevo fatto quel giorno. è proprio una cacchiata.


protected void RadioButtonProva_SelectedIndexChanged(object sender, EventArgs e)
{

string strQuery;

switch (RadioButtonProva.SelectedIndex)
{
case 0 :
strQuery = "SELECT sito, COUNT(*) AS score FROM siti_Provati GROUP BY sito ORDER BY sito DESC";
SqlDataSourceProva.SelectCommand = strQuery;
break;
case 1 :
strQuery = "SELECT tipo, COUNT(*) AS score FROM siti_Provati GROUP BY tipo ORDER BY tipo DESC";
SqlDataSourceProva.SelectCommand = strQuery;
break;
case 2 :
default:
break;
}

}


la gridView si aggiorna in automatico.

grazie LuxSkyWalker

LuxSkyWalker Profilo | Junior Member

Perfetto...


>grazie LuxSkyWalker
PREGO!!!

Ciao!

LuxSkyWalker
Junior Developer .NET
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