12 messaggi dal 27 giugno 2015
Ho creato una serie di filtri per le colonne di una tabella.
Funziona eh.
Ma vorrei chiedervi se, prima di tutto, il metodo per la costruzione del filtro è sicura secondo voi.
Se esiste una soluzione più efficiente.
E se esiste qualcosa di automatico, senza cliccare sul pulsante "Filtra", che ad ogni inserimento di carattere o ad ogni cambio dei vari menù mi filtri automaticamente la tabella.

    <div class="form-group col-md-2">
        <label class="control-label" for="SrcCliente">Cliente</label>
        <asp:TextBox ID="SrcCliente" runat="server" CssClass="form-control" OnTextChanged="FiltraGrid" CausesValidation="false" AutoPostBack="true">
        </asp:Textbox>
    </div>
    <div class="form-group col-md-1">
      <label class="control-label" for="SrcProv">Prov</label>
        <asp:DropDownList AppendDataBoundItems="true" ID="SrcProv" runat="server" CssClass="form-control" DataSourceID="SqlDataSource3" DataTextField="Prov" DataValueField="Prov">
                    <asp:ListItem Value="-1" Selected="True">Tutti</asp:ListItem> 
        </asp:DropDownList>
        <asp:SqlDataSource runat="server" ID="SqlDataSource3" ConnectionString='<%$ ConnectionStrings:ConnectionString %>' SelectCommand="SELECT DISTINCT Prov FROM Annuale Order by Prov"></asp:SqlDataSource>
    </div>
    <div class="form-group col-md-3">
      <label class="control-label" for="SrcServizio">Servizio</label>      
        <asp:DropDownList AppendDataBoundItems="true" ID="SrcServizio" runat="server" CssClass="form-control" DataSourceID="SqlDataSource4" DataTextField="Servizio" DataValueField="Id">
        <asp:ListItem Value="-1" Selected="True">Tutti</asp:ListItem> 
        </asp:DropDownList>
        <asp:SqlDataSource runat="server" ID="SqlDataSource4" ConnectionString='<%$ ConnectionStrings:ConnectionString %>' SelectCommand="SELECT [Id], [servizio] FROM [servizio]"></asp:SqlDataSource>
    </div>
    <div class="form-group col-md-2">
      <label class="control-label" for="SrcOperatore">Operatore</label>
        <asp:DropDownList AppendDataBoundItems="true" ID="SrcOperatore" runat="server" CssClass="form-control" DataSourceID="SqlDataSource5" DataTextField="Nome" DataValueField="Id">
        <asp:ListItem Value="-1" Selected="True">Tutti</asp:ListItem>  
        </asp:DropDownList>
        <asp:SqlDataSource runat="server" ID="SqlDataSource5" ConnectionString='<%$ ConnectionStrings:ConnectionString %>' SelectCommand="SELECT [Id], [Nome] FROM [operatori]"></asp:SqlDataSource>
    </div>
    <div class="form-group col-md-2">
                <label class="control-label" for="SrcScadedal">Scadenza dal</label>
        <div class='input-group date' >
             <asp:TextBox ID="SrcScadedal" runat="server" CssClass="form-control" placeholder="gg/mm/aaaa" ></asp:TextBox>
            <span class="input-group-addon">
                <span class="fa fa-calendar"></span>
            </span>
        </div>
    </div>
    <div class="form-group col-md-2">
                <label class="control-label" for="SrcScadeal">Scadenza al</label>
        <div class='input-group date' >
             <asp:TextBox ID="SrcScadeal" runat="server" CssClass="form-control" placeholder="gg/mm/aaaa" ></asp:TextBox>
            <span class="input-group-addon">
                <span class="fa fa-calendar"></span>
            </span>
        </div>
    </div>
            <asp:Button ID="Button2" runat="server" CausesValidation="false" Text="&#xf067; Aggiungi" class="fa btn btn-primary btn-sm fa" OnClick="FiltraGrid" /> 


    </div>


il metodo FiltraGrid:

 protected void FiltraGrid(object sender, EventArgs e)
        {


            string com = SrcCliente.Text.ToString().Trim();
            string prov = SrcProv.Text.ToString().Trim();
            string ser = SrcServizio.Text.ToString().Trim();
            string nom = SrcOperatore.Text.ToString().Trim();
            string constr = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                string sql = "SELECT Annuale.Id, Annuale.Cliente, Annuale.Prov, servizio.servizio, operatori.Nome, Annuale.Datascadenza, Annuale.linkweb" +
                               " FROM Annuale" +
                               " inner join operatori on Annuale.id_operatore = operatori.id" +
                               " inner join servizio on servizio.id = Annuale.id_servizio"+ 
                               " where 1=1 ";
                if (!String.IsNullOrEmpty(com))
                {
                    sql += " AND annuale.Cliente LIKE @Cliente+'%'";

                }
                if (prov != "-1")
                {
                    sql += " AND annuale.Prov LIKE @Prov";
                }
                if (ser != "-1")
                {
                    sql += " AND Annuale.id_servizio LIKE @Servizio";
                }
                if (nom != "-1")
                {
                    sql += " AND Annuale.id_operatore LIKE @Operatore";
                }
                if (!String.IsNullOrEmpty(SrcScadedal.Text.ToString().Trim()))
                {
                    sql += " AND Annuale.Datascadenza >= @Datada";
                }
                if (!String.IsNullOrEmpty(SrcScadeal.Text.ToString().Trim()))
                {
                    sql += " AND Annuale.Datascadenza <= @Dataa";
                }
                SqlConnection connection = new SqlConnection(constr);
                SqlCommand cmd = new SqlCommand(sql, connection);
           


            cmd.Parameters.AddWithValue("@Cliente", com);
            cmd.Parameters.AddWithValue("@Prov", prov);
            cmd.Parameters.AddWithValue("@Servizio", ser);
            cmd.Parameters.AddWithValue("@Operatore", nom);
            if (!String.IsNullOrEmpty(SrcScadedal.Text.ToString().Trim()))
            {
                
                cmd.Parameters.AddWithValue("@Datada", DateTime.Parse(SrcScadedal.Text));
            }
            if (!String.IsNullOrEmpty(SrcScadeal.Text.ToString().Trim()))
            {

                cmd.Parameters.AddWithValue("@Dataa", DateTime.Parse(SrcScadeal.Text));
            }
               cmd.CommandType = CommandType.Text;
                connection.Open();
                GridView1.DataSource = this.GetData(cmd);
                GridView1.DataBind();

        }
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Ma vorrei chiedervi se, prima di tutto, il metodo per la costruzione del filtro è sicura secondo voi.

Sì, sembra ok. Hai usato i SqlParameter, quindi sei protetto dalla Sql injection.


Se esiste una soluzione più efficiente.

Direi che il costo di comporre la query è trascurabile, quindi va bene come hai fatto. Per uniformità, avresti potuto usare un SqlDataSource anche per la GridView ma pazienza.


E se esiste qualcosa di automatico, senza cliccare sul pulsante "Filtra", che ad ogni inserimento di carattere o ad ogni cambio dei vari menù mi filtri automaticamente la tabella.

Così com'è ora, la tua pagina non è in grado di supportare questo scenario perché la ricerca avviene solo al postback di pagina. Sarebbe molto scomodo per l'utente digitare un carattere per poi doversi fermare per attendere il ricaricamento dell'intera pagina.

Quando hai bisogno di questo genere di funzionalità, devi ricorrere a richieste ajax che ti permetteranno di comunicare con il server senza che la pagina debba ricaricarsi. In questo modo l'utente sarà libero di digitare o di cambiare il valore dei filtri e vedere il contenuto della gridview aggiornato quasi istantaneamente.

Se vuoi iniziare ad usare le richieste ajax nella tua pagina, puoi scegliere due approcci:
  • Usi il controllo UpdatePanel di Microsoft Ajax per aggiornare il contenuto della GridView senza far ricaricare la pagina
  • Oppure (comporta modifiche più radicali) rinunci ad usare la GridView ed opti invece per una griglia tipo DataTables, che ha la possibilità di aggiornarsi tramite richieste ajax. Non si tratta di un controllo server come la GridView, quindi va installata unicamente lato client. Per quanto riguarda il server, invece, dovrai predisporre un Page Method che raccolga la richiesta del client e restituisca i dati JSON da rappresentare nella griglia.


Qui trovi una sorta di ibrido tra questi due approcci:
https://www.aspsnippets.com/Articles/Search-and-Filter-GridView-as-you-type-in-TextBox-using-jQuery-AJAX-in-ASPNet.aspx

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.