Home / Programmazione / C# - Asp.NET / Filtri GridView in Asp.NET e C#
Mattepuffo

Filtri GridView in Asp.NET e C#

Filtri GridView in Asp.NET e C#

GridView è uno controllo server molto comodo e molto utlizzato per rappresentare in maniera strutturata i dati presi da un database.

Hanno parecchie proprietà, ma gli manca la possibilità di filtrare i dati.

Oggi vi spiegao come ho fatto io per filtrare i dati attarverso una DropDownList.

In sostanza ho due DDL che fanno da filtro su una GV.

Tutti e tre prendono i dati da un ObjectDataSource e da metodi personalizzati.

Prima di tutto io ho aggiunto un nuovo progetto alla mia soluzione in modo da crare le varie classi/metodi personalizzati per interfacciarli al db, l'ho chiamato TNWB.

Qua dentro ho creato questa classe:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace TNWDB
{
public class Connection
{
private static SqlConnection conn = new SqlConnection("Data Source=10.0.5.131;Initial Catalog=TNW;Persist Security Info=True;User ID=user;Password=pass");

public static SqlConnection getConnection()
{
return conn;
}
}
}

Questa classe si occupa solo di istanziare la connessione.

 

A questo punto mettiamo su la classe per riempire ciò che ci interessa:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace TNWDB
{
public class Decoder
{
private static SqlConnection conn = Connection.getConnection();

public static DataSet ddlNetwork()
{
SqlDataAdapter adapter = null;
DataSet ds = null;
try
{
conn.Open();
adapter = new SqlDataAdapter("select_soluzioni", conn);
ds = new DataSet();
adapter.Fill(ds);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
ds.Dispose();
adapter.Dispose();
conn.Close();
}
return ds;
}

public static DataSet ddlGruppi(int par)
{
DataSet ds = null;
SqlDataAdapter adapter = null;
SqlCommand cmd = null;
try
{
conn.Open();
if (par == -1)
{
cmd = new SqlCommand("select_gruppi", conn);
cmd.CommandType = CommandType.StoredProcedure;
adapter = new SqlDataAdapter(cmd);
}
else
{
cmd = new SqlCommand("select_gruppi_soluzione", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@soluzione#", par);
adapter = new SqlDataAdapter(cmd);
}
ds = new DataSet();
adapter.Fill(ds);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
ds.Dispose();
adapter.Dispose();
conn.Close();
}
return ds;
}

public static DataSet gvSource(int network, int gruppo)
{
DataSet ds = null;
SqlDataAdapter adapter = null;
SqlCommand cmd = null;
try
{
conn.Open();
cmd = new SqlCommand("TNW_select_siti", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@soluzione_", network != -1 ? network : (object)DBNull.Value);
cmd.Parameters.AddWithValue("@gruppo_", gruppo != -1 ? gruppo : (object)DBNull.Value);
adapter = new SqlDataAdapter(cmd);
ds = new DataSet();
adapter.Fill(ds);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
ds.Dispose();
adapter.Dispose();
conn.Close();
}
return ds;
}

}

Questa classe ha tre metodi: i primi due sono per le DDL, il terzo per la GV.

Tutti e tre richiamano delle Stored Procedure.

Sui primi due nn c'è molto da segnalare; il terzo (quello della GV) invece ha due parametri, che sono quelli impostati nella Stored Procedure (SP):

@soluzione_ int, @gruppo_ int

As

SELECT siti.sito#, siti.localita, siti.descrizione, siti.IP, gruppi.descrizione AS Expr2, tipi_deploy.descrizione AS Expr1, siti.versione,siti.ultimo_avvio, siti.riserva, siti.app_disk_space, siti.versione_itl, tipi_connessione.descrizione AS tipo_connessione_, siti.TGU, tipologia_monitor.descrizione AS tipologia_monitor_, siti.ip_voyager

FROM siti

INNER JOIN tipi_deploy ON siti.tipo_deploy# = tipi_deploy.tipo_deploy#

INNER JOIN gruppi ON siti.gruppo#=gruppi.gruppo#

INNER JOIN tipi_connessione ON siti.tipo_connessione#=tipi_connessione.tipo_connessione#

INNER JOIN tipologia_monitor ON siti.tipologia_monitor#=tipologia_monitor.tipologia_monitor#

WHERE (soluzione# = @soluzione_ OR @soluzione_ is null) AND (gruppi.gruppo# = @gruppo_ Or @gruppo_ is null)

Nella query faccio un controllo sul valore dei parametri.

A questo punto vediamo che c'è nella pagina:

<asp:DropDownList ID="ddlNetwork" runat="server" DataSourceID="objNetwork" DataTextField="descrizione"
DataValueField="soluzione#" AppendDataBoundItems="True" AutoPostBack="True">
<asp:ListItem Selected="True" Value="-1">*</asp:ListItem>
</asp:DropDownList>
<asp:ObjectDataSource ID="objNetwork" runat="server" SelectMethod="ddlNetwork" TypeName="TNWDB.Decoder">
</asp:ObjectDataSource>

....................

<asp:DropDownList ID="ddlGruppi" runat="server" AppendDataBoundItems="True" AutoPostBack="True"
DataSourceID="objGruppi" DataTextField="descrizione" DataValueField="gruppo#"
EnableViewState="False">
<asp:ListItem Selected="True" Value="-1">*</asp:ListItem>
</asp:DropDownList>
<asp:ObjectDataSource ID="objGruppi" runat="server" SelectMethod="ddlGruppi" TypeName="TNWDB.Decoder">
</asp:ObjectDataSource>

......................

<asp:GridView ID="DecoderView" runat="server" DataKeyNames="sito#" DataSourceID="objDecoder"
AllowPaging="True" AllowSorting="True" AutoGenerateSelectButton="True" PageSize="5"
AutoGenerateColumns="False" CssClass="grid">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="SelectedItem" AutoPostBack="true" runat="server" OnCheckedChanged="btn_check" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="sito#" HeaderText="sito#" SortExpression="sito#" InsertVisible="False" />
<asp:BoundField DataField="localita" HeaderText="localita" SortExpression="localita" />
<asp:BoundField DataField="descrizione" HeaderText="descrizione" SortExpression="descrizione" />
<asp:BoundField DataField="IP" HeaderText="IP" SortExpression="IP" />
<asp:BoundField DataField="riserva" HeaderText="riserva" SortExpression="riserva" />
<asp:BoundField DataField="Expr2" HeaderText="gruppo#" SortExpression="Expr2" />
<asp:BoundField DataField="Expr1" HeaderText="tipo_deploy#" SortExpression="Expr1" />
<asp:BoundField DataField="versione" HeaderText="versione" SortExpression="versione" />
<asp:BoundField DataField="versione_itl" HeaderText="versione_itl" SortExpression="versione_itl" />
<asp:BoundField DataField="ultimo_avvio" HeaderText="ultimo_avvio" SortExpression="ultimo_avvio" />
<asp:BoundField DataField="app_disk_space" HeaderText="app_disk_space" SortExpression="app_disk_space" />
<asp:BoundField DataField="TGU" HeaderText="TGU" SortExpression="TGU" />
<asp:BoundField DataField="ip_voyager" HeaderText="ip_voyager" SortExpression="ip_voyager" />
</Columns>
<PagerSettings Visible="False" />
</asp:GridView>
<asp:ObjectDataSource ID="objDecoder" runat="server" SelectMethod="gvSource" TypeName="TNWDB.Decoder">
<SelectParameters>
<asp:ControlParameter ControlID="ddlNetwork" Name="network" PropertyName="SelectedValue"
Type="Int32" DefaultValue="-1" />
<asp:ControlParameter ControlID="ddlGruppi" Name="gruppo" PropertyName="SelectedValue"
Type="Int32" DefaultValue="-1" />
</SelectParameters>
</asp:ObjectDataSource>

Per gli ObjectDataSource semplicemente seguite il wizard indicando quali metodi volete; nel caso della GV dovete indicare i due parametri che corrispondono ai valori scelti nelle DDL.

L'unica cosa che dovete tenere a mente che nel progetto del sito (dove si trovano le pagine) dovete aggiunegere la Reference all'altro progetto; sennò gli ObjectDS non sono in grado di vedere i metodi.

Inolre tenete presente che nei metodi faccio restituire sempre dei DataSet, ma non è la prassi consigliata.

Comunque, l'importante sono la SP e i metodi; una volta messi apposto quelli usate il wizard degli ObjectDS e state a posto.

Io in pratica ho fatto così: la prima voce delle DDL è un * con valore -1; se viene scelta questa voce i due parametri, nella SP, sono nulli e quindi vengono presi i rislutati; sennò viene preso il loro valore e la GV viene filtrata.

Ovviamente le due DDL sono legate da FK alla tabella principale