Gridview con filtro dinamico

giovedì 08 gennaio 2009 - 17.35

jampicoll Profilo | Junior Member

Ciao a tutti.
Sto realizzando per la mia applicazione una sorta di filtro dinamico in cui seleziono la colonna da filtrare da una dropdownlist in cui inserisco manualmente i valori delle colonne della tabella e un altra dropdownlist che dovrebbe caricare i valori "distinct" della colonna selezionata.
Vi allego un immagine per capirci meglio.
Il problema è che non riesco a far caricare alla seconda dropdownlist i valori dinamicamente.
Fino al momento il codice è questo, credo che il problema sia nel valore della "select" ma non so come risolvere.

<asp:Label ID="Label20" runat="server" Text="Filtro per "></asp:Label>
<asp:DropDownList
ID="scelta" runat="server" AutoPostBack="True">
<asp:ListItem Value="stato"></asp:ListItem>
<asp:ListItem Value="tipologia"></asp:ListItem>
</asp:DropDownList>

<asp:Label ID="Label21" runat="server" Text="uguale a"></asp:Label>
<asp:DropDownList
ID="DropDownList9" runat="server" DataSourceID="SqlDataSource7" DataTextField="Column1"
DataValueField="Column1" AutoPostBack="True">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource7" runat="server"
ConnectionString="<%$ ConnectionStrings:progettiConnectionString %>"
SelectCommand="SELECT DISTINCT @scelta FROM [progetti]">
<SelectParameters>
<asp:ControlParameter ControlID="scelta" Name="scelta" PropertyName="SelectedValue" />
</SelectParameters>
</asp:SqlDataSource>
Vi allego anche un immagine di cosa voglio realizzare cosi da essere piu chiaro.
Spero mi possiata aiutare.

840x370 143Kb

kontax Profilo | Junior Member

Ciao, in attesa che qualcun'altro dica la sua..
Io onestamente passerei da codice.
<asp:Label ID="Label20" runat="server" Text="Filtro per "></asp:Label> <asp:DropDownList ID="scelta" runat="server" AutoPostBack="True" OnSelectedIndexChanged="cambia_select"> <asp:ListItem Value="stato" Selected="True"></asp:ListItem> <asp:ListItem Value="tipologia"></asp:ListItem> </asp:DropDownList> <asp:Label ID="Label21" runat="server" Text="uguale a"></asp:Label> <asp:DropDownList ID="DropDownList9" runat="server" DataSourceID="SqlDataSource7" DataTextField="Expr1" DataValueField="Expr1"> </asp:DropDownList> </div> <asp:SqlDataSource ID="SqlDataSource7" runat="server" ConnectionString="<%$ ConnectionStrings:progettiConnectionString %>" SelectCommand="SELECT DISTINCT stato as Expr1 FROM progetti"> </asp:SqlDataSource>
e conseguentemente nel code-behind la funzione cambia_select
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In questo modo cambi relativamente poco rispetto a quello che hai fatto. Io probabilmente avrei fatto tutto da codice..
Comunque c'è di sicuro una soluzione più elegante ma intanto questa funziona (non è un bel ragionamento, ma almeno ti sblocchi).
Ciao

jampicoll Profilo | Junior Member

OK. ho capito.
Adesso con lo stesso precedimento dovrei fare la select che alimenta il gridview, cioè:

select val_1, val_2,.... FROM progetti WHERE dropdownlist1=dropdownlist2

Puoi darmi una mano anche in questo???
Credo sia lo stesso procedimento o sbaglio?

jampicoll Profilo | Junior Member

Ci sto provando da ieri sera a fare la select che alimenta il gridview ma non mi riesce.
Per favore aiutatemi...

kontax Profilo | Junior Member

Eihlà,
allora, per la GridView se vuoi puoi usare lo stesso metodo..
Quindi, un esempio del codice può essere questo:
<asp:Label ID="Label20" runat="server" Text="Filtro per "></asp:Label> <asp:DropDownList ID="scelta" runat="server" AutoPostBack="True" OnSelectedIndexChanged="cambia_select"> <asp:ListItem Value="stato" Selected="True"></asp:ListItem> <asp:ListItem Value="tipologia"></asp:ListItem> </asp:DropDownList> <asp:Label ID="Label21" runat="server" Text="uguale a"></asp:Label> <asp:DropDownList ID="DropDownList9" runat="server" DataSourceID="SqlDataSource7" DataTextField="Expr1" DataValueField="Expr1" AutoPostBack="True" OnSelectedIndexChanged="Drop2IndexChanged"> </asp:DropDownList> </div> <asp:SqlDataSource ID="SqlDataSource7" runat="server" ConnectionString="<%$ ConnectionStrings:progettoConnectionStringConnectionString %>" SelectCommand="SELECT DISTINCT stato as Expr1 FROM progetti"> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"> </asp:GridView> <br /> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:progettoConnectionString %>" SelectCommand="SELECT [stato], [tipologia] FROM [progetti] WHERE ([stato] = @valore)"> <SelectParameters> <asp:ControlParameter ControlID="DropDownList9" Name="valore" PropertyName="SelectedValue" Type="String" /> </SelectParameters> </asp:SqlDataSource>
E nel code-behind:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Questo dovrebbe funzionare di base, poi te lo personalizzi come meglio credi.
Personalmente io metterei un elemento di tipo "seleziona" all'inizio delle drop, che non provoca il caricamento di nulla. Poi farei il tutto a comparsa, cioè:
1)stato iniziale, visibile solo la drop con il seleziona, l'utente seleziona un valore, postback
2)compare la seconda drop con il suo seleziona visibile, l'utente seleziona e parte il postback
3)compare la grid con i valori selezionati
Inoltre, il metodo che stiamo usando non mi convince tantissimo, io caricherei direttamente tutto da codice senza usare gli sqldatasource, facendo la query a mano e poi caricando i dati nella grid.
Se hai bisogno di codice per una di queste cose, chiedi.
Ciao

jampicoll Profilo | Junior Member

Davvero non so come ringraziati!!!
Sei davvero gentilissimo e...bravissimo.

In effetti come dici tu potrebbe essere piu carino ma c'è un problema...NON LO SO FARE!!!!

Se tu hai del tempo e riesci a farlo funzionare in quel modo bene, altrimenti va bene anche cosi.
A me basterebbe magari la gridview completa con tutti i dati all'inizio e che carichi il filtro dopo una selezione.

Ti ringrazio di cuore.

kontax Profilo | Junior Member

Ti ho buttato giù in 5 min. un paio di esempi, guarda se ti tornano comodo.
Ti spiego:
La pagina default.aspx contiene quello che ti avevo detto, con l'invisibilità, etc. Inoltre la gridview viene caricata da codice senza sqldatasource. Ci sono due funzioni per caricarla, una ti mette i valori tutti maiuscoli, per farti vedere come si potrebbero manipolare i dati in ingresso.
La pagina default1.aspx invece è come avevi detto nell'ultima risposta. In questo caso sia la seconda drop che la grid sono caricate da codice.
Essendo state fatte in fretta e furia non garantisco niente...cmq dacci un'occhiata per vedere se c'è qualcosa che ti può tornare comodo.
Ciao


jampicoll Profilo | Junior Member

Tutto perfetto.
Davvero gentilissimo!!!!
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