none
Salvare i dati di una selezione in DropDownList in cache RRS feed

  • Domanda

  • Ciao a tutti.

    Avrei necessità di salvare i dati di una selezione in una DropDownList in cache, in modo da recuperarli da lì invece di dover rieseguire la query ad ogni PostBack.

    Scrivo così:

    string p = DropDownList1.SelectedValue;
                Cache.Insert("SelezioneDDL1", p, null, DateTime.UtcNow.AddMinutes(60), System.Web.Caching.Cache.NoSlidingExpiration);
                Response.Write(p + "<br /><br />");

    E nell'eventGridView1_PageIndexChanging :

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            DataSet dt = (DataSet)Cache["SelezioneDDL1"];
            GridView1.DataSource = dt;        
            GridView1.DataBind();
            GridView1.PageIndex = e.NewPageIndex;
        }

    Ma al momento del cambio pagina nella GridView ottengo questo errore, cosa sbaglio? Grazie.

    Impossibile eseguire il cast di oggetti di tipo 'System.String' sul tipo 'System.Data.DataSet'.
    sabato 21 luglio 2012 20:07

Risposte

Tutte le risposte

  • Stai salvando in chace il valore selezionato nella DropDownList, che è una stringa, ma poi in GridView1_PageIndexChanging cerchi di convertire tale valore in un oggetto DataSet.

    Quello che devi salvare il cache è l'intero DataSet. Assicurati di aver letto e compreso bene il funzionamento della cache in ASP .NET, è necessario un po' di tempo e di studio per capire come sfruttarla nel modo corretto.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    sabato 21 luglio 2012 20:20
    Postatore
  • Stai salvando in chace il valore selezionato nella DropDownList, che è una stringa, ma poi in GridView1_PageIndexChanging cerchi di convertire tale valore in un oggetto DataSet.

    Quello che devi salvare il cache è l'intero DataSet. Assicurati di aver letto e compreso bene il funzionamento della cache in ASP .NET, è necessario un po' di tempo e di studio per capire come sfruttarla nel modo corretto.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Grazie.

    Leggendo la documentazione riportata nel capitolo «Memorizzare i dati nella cache attraverso l'oggetto cache» mi sembra d'aver capito che nel mio caso devo memorizzare in cache il DataTable e ho prodotto questo codice.

    1. Non ho errori;
    2. Non capisco perchè il cambio pagina nella GridView avvenga solo al secondo tentativo (click del mouse sul numero pagina) e non al primo tentativo, sia se le DDL sono state utilizzate selezionandone un valore o meno.
    3. Cosa sbaglio?
    OdbcConnection myConnectionString = 
    new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString);
        OdbcCommand Sqlcmd;
        OdbcDataAdapter da;
        DataTable dt = new DataTable();
        String query;
    
    ......
    
     //DropDownList1
        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadGrid();
        }
        void LoadGrid()
        {
            myConnectionString.Open();
    
            Cache["dtmycache"] = dt;
    
            if (DropDownList1.SelectedIndex == 0)
            {
                //esegui query senza condizioni;
            }
            else
            {
    
                //POPOLA GRIDVIEW
                //POPOLA DDL2
    
            }
            Sqlcmd = new OdbcCommand(query, myConnectionString);
            da = new OdbcDataAdapter(Sqlcmd);
            dt.Clear();
            da.Fill(dt);
            DataList1.DataSource = dt;
            DataList1.DataBind();
            if (dt.Rows.Count > 0)
            {
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
            myConnectionString.Close();
            myConnectionString.Dispose();
        }
    
    
    
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
    
            DataTable dt = (DataTable)Cache["dtmycache"];
            GridView1.DataSource = dt;        
            GridView1.DataBind();
            GridView1.PageIndex = e.NewPageIndex;
        }

    domenica 22 luglio 2012 10:26
  • Nel metodo LoadGrid, stai inserendo l'oggetto dt in cache PRIMA di averlo popolato.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 10:39
    Postatore
  • Nel metodo LoadGrid, stai inserendo l'oggetto dt in cache PRIMA di averlo popolato.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Grazie, provo così ma non cambia nulla:

            Sqlcmd = new OdbcCommand(query, myConnectionString);
            da = new OdbcDataAdapter(Sqlcmd);
            dt.Clear();
            da.Fill(dt);
            DataList1.DataSource = dt;
            DataList1.DataBind();
            if (dt.Rows.Count > 0)
            {
                GridView1.DataSource = dt;
                GridView1.DataBind();
                Cache.Remove("dtmycache");
                Cache["dtmycache"] = dt;
            }
    domenica 22 luglio 2012 11:37
  • Metti punti di interruzione nel codice e fai un'esecuzione passo-passo, controllando il valore degli oggetti e delle variabili durante l'utilizzo dell'applicazione.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 11:39
    Postatore
  • Metti punti di interruzione nel codice e fai un'esecuzione passo-passo, controllando il valore degli oggetti e delle variabili durante l'utilizzo dell'applicazione.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Grazie.

    Punto di interruzione su DataTable dt = (DataTable)Cache["dtmycache"]; questo è il risultato al primo tentativo di cambiare pagina nella GridView:

    domenica 22 luglio 2012 12:05
  • Forse nella tua pagina ASPX hai dichiarato una variabile a livello di classe con lo stesso nome dt?

    Inoltre, per verificare il valore che leggi dalla cache, devi eseguire l'istruzione corrispondente, altrimenti non puoi sapere cosa la cache contiene.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 12:08
    Postatore
  • Forse nella tua pagina ASPX hai dichiarato una variabile a livello di classe con lo stesso nome dt?

    Inoltre, per verificare il valore che leggi dalla cache, devi eseguire l'istruzione corrispondente, altrimenti non puoi sapere cosa la cache contiene.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Queste sono le variabili dichiarate a livello di classe:

    OdbcConnection myConnectionString = 
    new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString);
        OdbcCommand Sqlcmd;
        OdbcDataAdapter da;
        DataTable dt = new DataTable();
        String query;

    Per sicurezza ho dichiarato una seconda variabile dt1, ma nel debug è sempre null:

            if (dt.Rows.Count > 0)
            {
                GridView1.DataSource = dt;
                GridView1.DataBind();
    
                Cache.Remove("dtmycache");
                if (Cache["dtmycache"] == null)
                {                
                    Cache["dtmycache"] = dt;
                    Cache.Insert("dtmycache", dt, null, DateTime.UtcNow.AddMinutes(60), System.Web.Caching.Cache.NoSlidingExpiration); 
                }
            }
    
    
    
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            DataTable dt1 = (DataTable)Cache["dtmycache"];
            string p = Cache["dtmycache"].ToString();
            Response.Write(p);
            GridView1.DataSource = dt1;        
            GridView1.DataBind();
            GridView1.PageIndex = e.NewPageIndex;
        }

    domenica 22 luglio 2012 12:52
  • Verifica che il contenuto del DataTable dt venga effettivamente inserito in cache.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 12:54
    Postatore
  • Verifica che il contenuto del DataTable dt venga effettivamente inserito in cache.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    No, il DataTable dt non viene inserito in cache...
    domenica 22 luglio 2012 13:26
  • Direi che hai identificato il problema. Usando sempre l'esecuzione passo-passo, cerca di capire il perché.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 13:31
    Postatore
  • Non ne vuole sapere proprio... ho provato anche così ma va in errore perchè il DataTable dt non viene inserito in cache... ma perchè?

    Dettagli eccezione: System.NotSupportedException: L'origine dati non supporta il paging dei dati sul lato server.

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                BindGridView(); 
                LoadGrid();
            }
    
        }
    
    
    
        private object LoadData()
        {
            if (Cache["dtmycache"] != null)
            {
               return Cache["dtmycache"];
            }
            else
            {
                
                OdbcConnection myConnectionString = 
                    new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString);
                Cache["dtmycache"] = myConnectionString.DataSource;
                return myConnectionString.DataSource;
            }
        }
    
    
    
        private void BindGridView()
        {
            GridView1.DataSource = this.LoadData();
            GridView1.DataBind();
        }
    
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            BindGridView();
        }


    domenica 22 luglio 2012 14:17
  • Scusa, se fai un'esecuzione passo-passo, vedrai esattamente quali istruzioni sono eseguite e quindi perché il DataTable non viene inserito in cache.

    Torna però al tuo codice precedente, perché l'ultimo esempio che hai mostrato è sbagliato, la proprietà OdbcConnection.DataSource restituisce il nome del server o del file della tua sorgente dati, non i dati veri e propri.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 14:23
    Postatore
  • Grazie.

    Scusa, ma quando dici esecuzione passo-passo ti riferisci a punto di interruzione e debug con F10 ?

    L'ho fatto ma il perchè DataTable non viene inserito in cache non lo capisco, perchè più di null non vedo nella variabile.


    • Modificato cms9651 domenica 22 luglio 2012 14:34
    domenica 22 luglio 2012 14:33
  • Certo... Facendo esecuzione passo-passo, dovresti verificare facilmente se l'istruzione che inserisce il DataTable in cache viene eseguita oppure no.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 14:38
    Postatore
  • Grazie, abbi pazienza.

    1. Punto di interruzione su Cache.Remove("dtmycache");
    2. Proseguo con passo-passo (F10);
    3. Quando arrivo sull'istruzione per l'inserimento di DataTable in cache ecco l'output:

    domenica 22 luglio 2012 14:50
  • OK... Quindi successivamente dovresti poter recuperare il valore in cache. Continua il debug e verifica che il valore che leggi sia diverso da null.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 14:54
    Postatore
  • Grazie.

    La stringa string p = Cache["dtmycache"].ToString(); dove provo a recuperare il valore inserito in cache, in debug è sempre null.

    domenica 22 luglio 2012 15:01
  • Nel codice che hai mostrato prima, stai inserendo l'oggetto dt in cache due volte. Come mai?

    Magari prova a fare un test più semplice, anche in un'applicazione a parte, in cui inserisci in cache una stringa e successivamente cerchi di recuperarla. In questo modo, ti assicurerai di stare utilizzando la cache nel modo corretto.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 15:07
    Postatore
  • Grazie, si ho visto e ho corretto.

    In una simulazione semplice l''utilizzo dell'inserimento in cache è corretto.

    Il problema nel codice originale è sull'inserimento del DataTable.

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestCache.aspx.cs" Inherits="FiltraGDW_Default3" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <asp:Label ID="Label1" runat="server"></asp:Label>
        </div>
        </form>
    </body>
    </html>
    
    
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class FiltraGDW_Default3 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Cache["dtmycache"] = "Prova inserimento variabile in cache";
            Cache.Insert("dtmycache", "Prova inserimento variabile in cache", null, DateTime.UtcNow.AddMinutes(60), System.Web.Caching.Cache.NoSlidingExpiration);
            Label1.Text = Cache["dtmycache"].ToString();
        }
    }

    domenica 22 luglio 2012 15:15
  • Stai inserendo e recuperando il valore nello stesso postback. Prova a rileggere il dato in un postback successivo (ad esempio, in seguito alla pressione di un pulsante).

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 15:18
    Postatore
  • Stai inserendo e recuperando il valore nello stesso postback. Prova a rileggere il dato in un postback successivo (ad esempio, in seguito alla pressione di un pulsante).

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Grazie.

    Ma ti riferisci alla simulazione o al codice originale?

    Sulla simulazione funziona anche a seguito della pressione di un pulsante.

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestCache.aspx.cs" Inherits="FiltraGDW_Default3" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <asp:Label ID="Label1" runat="server"></asp:Label>
        <asp:ImageButton ID="Button1" ImageUrl="/images/conferma.gif" runat="server" 
         OnClick="Button1_Click" OnClientClick="if(!confirm('Confermi?')) return false;" />
        </div>
        </form>
    </body>
    </html>
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class FiltraGDW_Default3 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Cache.Remove("dtmycache"); 
    
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            Cache["dtmycache"] = "Prova inserimento variabile in cache";
            Cache.Insert("dtmycache", "Prova inserimento variabile in cache", null, DateTime.UtcNow.AddMinutes(60), System.Web.Caching.Cache.NoSlidingExpiration);
            Label1.Text = Cache["dtmycache"].ToString();
        }
    }

    domenica 22 luglio 2012 15:27
  • Mi riferisco alla simulazione... Ma non ci siamo.

    Nel codice che hai mostrato, stai inserendo un dato in cache e lo stai recuperando immediatamente, all'interno dello stesso postback.

    Quello che devi fare, invece, è inserire il dato in cache, ad esempio in fase di Load della pagina (con il solito controllo if (!IsPostBack)), e quindi rileggerlo in seguito alla pressione di un pulsante.

    Sicuro di aver compreso bene come funziona la cache in ASP .NET?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 15:33
    Postatore
  • Grazie.

    Si, credo d'aver capito come funziona la cache in ASP .NET.

    Infatti seguendo la tua ultima indicazione e inserendo un dato in cache nel Load della pagina, questo mi viene restituito correttamente alla pressione del pulsante nella LabelText.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class FiltraGDW_Default3 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Cache.Remove("dtmycache");
                Cache.Insert("dtmycache", "Prova inserimento variabile in cache", null, DateTime.UtcNow.AddMinutes(60), System.Web.Caching.Cache.NoSlidingExpiration);
            }
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Text = Cache["dtmycache"].ToString();
        }
    }

    Output alla pressione del pulsante: Prova inserimento variabile in cache.



    • Modificato cms9651 domenica 22 luglio 2012 15:43
    domenica 22 luglio 2012 15:39
  • Allora l'unica spiegazione è che ci sia qualche altro problema nel tuo codice originale... Magari per qualche motivo effettui il Remove dei dati in cache anche quando non dovresti, e quindi quando vai ad eseguire il metodo PageIndexChanging trovi il valore null.

    Faccio solo delle ipotesi perché, senza vedere il codice completo, non posso darti altre indicazioni. Riguarda attentamente l'applicazione, metti punti di interruzioni su tutte le righe che lavorano con la cache e verifica quando vengono richiamate.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 15:44
    Postatore
  • Grazie.

    Di seguito il codice originale, magari un occhio esperto come il tuo può individuare il problema con maggiore facilità; nel frattempo mi riguardo per l'ennesima volta il tutto.

    using System;
    using System.IO;
    using System.Data;
    using System.Data.Odbc;
    using System.Configuration;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    
    
    public partial class _Default : System.Web.UI.Page
    //inizio
    {
        OdbcConnection myConnectionString = new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString);
        OdbcCommand Sqlcmd;
        OdbcDataAdapter da;
        DataTable dt = new DataTable();
        String query;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                
                DropDownList1.AppendDataBoundItems = true;
                OdbcConnection myConnectionString = 
                   new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString);
                String strQuery = "SELECT * FROM tbl_test WHERE 1 LIMIT 4;";
                OdbcCommand objCmd = new OdbcCommand(strQuery, myConnectionString);
                objCmd.CommandType = CommandType.Text;
                objCmd.CommandText = strQuery;
    
                try
                {
                    myConnectionString.Open();
                    DropDownList1.DataSource = objCmd.ExecuteReader();
                    DropDownList1.DataTextField = "denominazioneunita";
                    DropDownList1.DataValueField = "siglaunita";
                    DropDownList1.DataBind();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    myConnectionString.Close();
                    myConnectionString.Dispose();
                }
    
                LoadGrid();
            }
    
        }
    
    
        // Inizio DropDownList1
        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadGrid();
        }
        void LoadGrid()
        {
            myConnectionString.Open();
    
            if (DropDownList1.SelectedIndex == 0)
            {
                query = "select * from tbl_test";
            }
            else
            {
                
                DropDownList2.Items.Clear();
                DropDownList2.Items.Add(new ListItem("------", ""));
                DropDownList2.AppendDataBoundItems = true;
                DropDownList3.Items.Clear();
                DropDownList3.Items.Add(new ListItem("------", ""));
    
                query = "select * from tbl_test " +
                        "WHERE 1 AND siglaunita LIKE CONCAT('%',LEFT('" + DropDownList1.SelectedValue + "',2),'%')" +
                        "AND (LENGTH(siglaunita) BETWEEN 1 AND 4) AND ((INSTR(denominazioneunita, 'ZONA')) OR (INSTR(denominazioneunita, '-'))) " +
                        "ORDER BY denominazioneunita ASC";
                Response.Write("POPOLA GRIDVIEW : " + query + "<br /><br />");
    
                String strQuery = "SELECT * FROM tbl_test WHERE 1 AND siglaunita LIKE CONCAT('%',LEFT(?,2),'%')" +
                                  "AND (LENGTH(siglaunita) BETWEEN 1 AND 4) AND ((INSTR(denominazioneunita, 'ZONA')) OR (INSTR(denominazioneunita, '-'))) " +
                                  "ORDER BY denominazioneunita ASC";
                Response.Write("POPOLA DDL2 : " + strQuery + "<br /><br />");
    
                OdbcCommand objCmd = new OdbcCommand(strQuery, myConnectionString);
                objCmd.Parameters.AddWithValue("?", DropDownList1.SelectedItem.Value);
                objCmd.CommandType = CommandType.Text;
                objCmd.CommandText = strQuery;
                objCmd.Connection = myConnectionString;
    
                try
                {
                    DropDownList2.DataSource = objCmd.ExecuteReader();
                    DropDownList2.DataTextField = "denominazioneunita";
                    DropDownList2.DataValueField = "siglaunita";
                    DropDownList2.DataBind();
                    if (DropDownList2.Items.Count > 1)
                    {
                        DropDownList2.Enabled = true;
                    }
                    else
                    {
                        DropDownList2.Enabled = false;
                        DropDownList3.Enabled = false;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
    
                }
            }
            Sqlcmd = new OdbcCommand(query, myConnectionString);
            da = new OdbcDataAdapter(Sqlcmd);
            dt.Clear();
            da.Fill(dt);
    
            DataList1.DataSource = dt;
            DataList1.DataBind();
    
    
        // Inizio Inserimento in cache del datatable
            Cache.Insert("dtmycache", dt, null, DateTime.UtcNow.AddMinutes(60), System.Web.Caching.Cache.NoSlidingExpiration);
        // Fine Inserimento in cache del datatable
    
            
            if (dt.Rows.Count > 0)
            {
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
            myConnectionString.Close();
            myConnectionString.Dispose();
        }
        // Fine DropDownList1
    
        
    
        // Inizio DropDownList 2
        protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadGrid2();
        }
    
        void LoadGrid2()
        {
            myConnectionString.Open();
            if (DropDownList2.SelectedIndex == 0)
            {
                query = "select * from tbl_test";
            }
            else
            {
    
                DropDownList3.Items.Clear();
                DropDownList3.Items.Add(new ListItem("------", ""));
                DropDownList3.AppendDataBoundItems = true;
    
                query = "select * from tbl_test " +
                        "WHERE 1 AND LEFT(siglaunita,4) = '" + DropDownList2.SelectedValue + "'";
                Response.Write("DDL3 POPOLA GRIDVIEW : " + query + "<br /><br />");
    
                String strQuery = "select * from tbl_test " +
                                  "WHERE 1 AND LEFT(siglaunita,4) = '" + DropDownList2.SelectedValue + "'";
                Response.Write("POPOLA DDL3 : " + strQuery + "<br /><br />");
    
                OdbcCommand objCmd = new OdbcCommand(strQuery, myConnectionString);
                objCmd.Parameters.AddWithValue("?", DropDownList2.SelectedItem.Value);
                objCmd.CommandType = CommandType.Text;
                objCmd.CommandText = strQuery;
                objCmd.Connection = myConnectionString;
    
                try
                {
                    DropDownList3.DataSource = objCmd.ExecuteReader();
                    DropDownList3.DataTextField = "denominazioneunita";
                    DropDownList3.DataValueField = "siglaunita";
                    DropDownList3.DataBind();
                    if (DropDownList3.Items.Count > 1)
                    {
                        DropDownList3.Enabled = true;
                    }
                    else
                    {
                        DropDownList3.Enabled = false;
                    }
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
    
                }
    
            }
    
            Sqlcmd = new OdbcCommand(query, myConnectionString);
            da = new OdbcDataAdapter(Sqlcmd);
            dt.Clear();
            da.Fill(dt);
            DataList1.DataSource = dt;
            DataList1.DataBind();
            if (dt.Rows.Count > 0)
            {
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
    
            myConnectionString.Close();
            myConnectionString.Dispose();
        }
        // Inizio DropDownList2
    
    
        // Inizio DropDownList3
        protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadGrid3();
        }
    
        void LoadGrid3()
        {
            myConnectionString.Open();
            if (DropDownList2.SelectedIndex == 0)
            {
                query = "select * from tbl_test";
            }
            else
            {
    
                query = "select * from tbl_test " +
                        "WHERE 1 AND siglaunita = '" + DropDownList3.SelectedValue + "'";
                Response.Write("DDL3 POPOLA GRIDVIEW : " + query + "<br /><br />");
    
                OdbcCommand objCmd = new OdbcCommand(query, myConnectionString);
                objCmd.Parameters.AddWithValue("?", DropDownList3.SelectedItem.Value);
                objCmd.CommandType = CommandType.Text;
                objCmd.CommandText = query;
                objCmd.Connection = myConnectionString;
            }
    
            Sqlcmd = new OdbcCommand(query, myConnectionString);
            da = new OdbcDataAdapter(Sqlcmd);
            dt.Clear();
            da.Fill(dt);
            DataList1.DataSource = dt;
            DataList1.DataBind();
            if (dt.Rows.Count > 0)
            {
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
    
            myConnectionString.Close();
            myConnectionString.Dispose();
        }
        // Fine DropDownList3
    
    
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            DataTable dt = (DataTable)Cache["dtmycache"];
            string p = Cache["dtmycache"].ToString();
            Response.Write(p);
            GridView1.DataSource = dt;        
            GridView1.DataBind();
            GridView1.PageIndex = e.NewPageIndex;
        }
    
        //fine
    }
    

    domenica 22 luglio 2012 15:50
  • Sicuramente non serve a niente (e magari l'hai anche già fatto), ma come prima cosa io rinominerei la variabile dt utilizzata in PageIndexChanging perché abbia un nome diverso dalla variabile dt dichiarata a livello di classe.

    Poi, verifica che al primo caricamento della pagina il dato sia inserito in cache, dopodiché cambia pagina nella GridView e verifica quanto vale Cache["dtmycache"] quando entri nell'evento PageIndexChanging. Non c'è bisogno che usi il metodo ToString e lo stampi. Puoi scrivere semplicemente:

    if (Cache["dtmycache"] != null)
    {
        // Il dato è presente in cache.
    }
    else
    {
        // La cache non contiene dati
    }

    E quindi mettere un punto di interruzione sull'istruzione if.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 16:35
    Postatore
  • Grazie.

    1. Rinominata la variabile dt utilizzata in PageIndexChanging in dt_new;
    2. Al primo caricamento della pagina il dato non risulta inserito in cache;
    3. Al cambio pagina nella GridView il valore di Cache["dtmycache"] quando si entra nell'evento PageIndexChanging è uguale a: Il dato è presente in cache.
    4. Il cambio pagina nella GridView avviene al secondo tentativo sul numero della pagina;

    Quando scrivi di verifica del dato in cache al primo caricamento della pagina intendi la sua verifica all'interno dell'evento Load con il controllo if (!IsPostBack)) ?



    • Modificato cms9651 domenica 22 luglio 2012 17:18
    domenica 22 luglio 2012 17:10
  • Al cambio pagina nella GridView il valore di Cache["dtmycache"] quando si entra nell'evento PageIndexChanging è uguale a: Il dato è presente in cache.

    Allora direi che il dato in cache è salvato correttamente. Dovresti quindi poter effettuare il bind con la griglia.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 22 luglio 2012 17:18
    Postatore
  • Grazie, ma c'è ancora qualcosa che non funziona.

    La sequenza è questa:

    1. Carico la pagina;
    2. Provo il cambio pagina nella GridView e in output ho Il dato è presente in cache, ma si non cambia pagina nella GridView;
    3. Riprovo il cambio pagina nella GridView e stavolta va a buon fine, con output sempre Il dato è presente in cache.



    • Modificato cms9651 domenica 22 luglio 2012 17:24
    domenica 22 luglio 2012 17:22
  • Devi impostare la proprietà PageIndex della GridView PRIMA di effettuare il DataBind.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    • Contrassegnato come risposta cms9651 domenica 22 luglio 2012 17:37
    domenica 22 luglio 2012 17:25
    Postatore
  • Grazie, grazie mille per l'aiuto a comprendere i miei errori.

    L'ho già detto, ma lo ripeto: sei un OTTIMO insegnante.

    Adesso funziona alla perfezione !

    domenica 22 luglio 2012 17:31