Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    9

    Problema con refresh ajax di controlli in array

    Ciao a tutti, volevo porvi un quesito (a mio parere banale) sul quale sto sbattendo la testa da un pò senza trovare una soluzione. Molto semplicemente ho un form in cui ci sono una serie di controlli Table che vengono aggiornati periodicamente con un timer ajax. Dovendo aggiornare da codice le tabelle, ho creato un array nella fasi di inizializzazione composto da tutti le tabelle del form e poi ciclando su tutta la lunghezza del vettore ho modificato i valori.
    Il problema è che nella fase di pre load l'inizializzazione funziona mentre le stesse funzioni richiamate all'interno di un timer non danno errore ma non aggiornano neppure i dati.
    Vi riporto qualche riga di codice di esempio:

    static public Table[] tbl;
    static int totInt;
    protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    tbl= new Table[3]{Table1,Table2,Table3};
    for (byte curTbl = 0; curTbl < curTbl.Count; curTbl ++)
    {
    tbl[curPnl].Rows[0].Cells[0].Text = "Prova"
    }
    }
    }

    protected void Timer1_Tick(object sender, EventArgs e)
    {
    for (byte curTbl = 0; curTbl < curTbl.Count; curTbl ++)
    {
    tbl[curPnl].Rows[0].Cells[0].Text = "Ciao"
    }
    }

    Quello che non capisco è come mai nella fase di Load i controlli vengono inizializzati correttamente mentre quando lo stessa procedura viene fatta nel timer non ho un aggiornamento dell' immagine.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    120
    Ciao
    ammetto che non mi è molto chiaro il tuo codice ( curTBL dichiarato nel ciclo for, ma poi usato come limite per il ciclo stesso anche se come indice di accesso all'array usi un curPnl che non vedo definito da nessuna parte ) ma immagino che la cosa dipenda dal copia e incolle,

    secondo me il problema sta nella !IsPostBack:


    codice:
    static public Table[] tbl;
    al primo caricamento ( in get ) viene create la variabile tbl, vuota

    codice:
    if (!IsPostBack)
    {
    tbl= new Table[3]{Table1,Table2,Table3};
    for (byte curTbl = 0; curTbl < curTbl.Count; curTbl ++)
    {
    tbl[curPnl].Rows[0].Cells[0].Text = "Prova"
    }
    , e viene inizializzata con una new Table[3]

    Al Tick del Timer viene ricreata la variabile tbl ( sempre vuota ) ma non viene inizializzata ( in quanto la chiamata è Post ), quindi le assegnazioni nel ciclo non faranno proprio nulla ( anzi dubito fortemente che così scritto il codice non vada semplicemente in eccezione ) .

    Quello che devi fare è salvare il contenuto della tabella in sessione, o in una HiddenField che fai viaggiare avanti ed indietro. Non dimenticarti che il web è State Less : ad ogni chiamata tutte le variabili vengono ridefinite, tutte le new fatte alla chiamata precedente non valgono più niente ( a meno che non salvi gli oggetti in appositi repository )

    Spero di esserti stato utile. Se non ti è chiaro qlcs o se non ho capito io la tua richiesta posta pezzi di codice più completi

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    9
    Quello che devi fare è salvare il contenuto della tabella in sessione, o in una HiddenField che fai viaggiare avanti ed indietro.
    il codice che non ti torna, come hai detto tu è un problema di copia e incolla. Se potessi darmi qualche info in più sui modi di salvare i dati della tabella in session o negli hidden field te ne sarei grato.
    In pratica fai conto che le label delle tabelle sono sempre le stesse, quello che cambia è solo il colore di sfondo di alcune celle.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    120
    Solo ora mi sono accorto che hai definito la variabile come static, e quindi la mia spiegazione sullo state less crolla completamente. All'interno delle stessa classe la variabile static dovrebbe essere valorizzata alla chiamata successiva.

    Ma le tre tabelle si trovano in un Update Panel?
    Puoi postare un po' più di codice? ( anche aspx )

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    9
    Si, le tre tabelle sono all'interno di un update panel .

    <div class="body">
    <asp:UpdatePanel ID="UpdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
    <asp:Table ID="Table1" runat="server">
    <asp:TableRow ID="TableRow1" runat="server"">
    <asp:TableCell ID="TableCell1" runat="server" Width="20px"></asp:TableCell>
    <asp:TableCell ID="TableCell2" runat="server" Width="60px"></asp:TableCell>
    </asp:TableRow>
    <asp:TableRow ID="TableRow2" runat="server" >
    <asp:TableCell ID="TableCell3" runat="server" Width="20px"></asp:TableCell>
    <asp:TableCell ID="TableCell4" runat="server" Width="60px"></asp:TableCell>
    </asp:TableRow>
    <asp:TableRow ID="TableRow3" runat="server" >
    <asp:TableCell ID="TableCell5" runat="server" Width="20px"></asp:TableCell>
    <asp:TableCell ID="TableCell6" runat="server" Width="60px"></asp:TableCell>
    </asp:TableRow>
    </asp:Table>
    </ContentTemplate>
    <Triggers>
    <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
    </Triggers>
    </asp:UpdatePanel>
    <asp:Timer ID="Timer1" runat="server" Interval="1000" ontick="Timer1_Tick">
    </asp:Timer>
    </div>

    Ho riportato il codice di una sola tabella perchè le altre sono uguali

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    120
    Eh, decisamente meno banale di quanto avessi capito all'inizio
    Il fatto è che tu salvi un'array di riferimenti ad oggetti. L'array ( essendo static ) vive all'interno delle varie chiamate, ma nella seconda chiamata l'oggetto Table1 è stato ricreato ed il riferimento che ti sei tenuto in memoria è totalmente inutile.

    La soluzione può essere fare riferimento agli ID degli oggetti
    codice:
    TableCell1.Text = DateTime.Now.ToString(); //con il Now si vedono bene i cambiamenti ad ogni Tick
    se però vuoi fare un ciclo il mio consiglio è salvarti nell'array non gli oggetti ma i loro ID,


    codice:
      static public String[] tblID;
      static int totInt;
      protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    tbl= new String[3]{"Table1","Table2","Table3"};
    for (byte curTbl = 0; curTbl < 3; curTbl ++)
    {
      Table t = (Table)FindControl(tbl[curTbl]);
    
    t.Rows[0].Cells[0].Text  = "Prova";
    }
    }
    }
    
      protected void Timer1_Tick(object sender, EventArgs e)
    {
    for (byte curTbl = 0; curTbl < 3; curTbl ++)
    {
      Table t = (Table)FindControl("Table1");
      t.Rows[0].Cells[0].Text= DateTime.Now.ToString();
    }
    }
    Prova così e fammi sapere

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    9
    nella seconda chiamata l'oggetto Table1 è stato ricreato ed il riferimento che ti sei tenuto in memoria è totalmente inutile.
    ecco dove era la ca****a. Come hai detto tu, giustamente, l'array rimane ma non esiste più la Table1 a cui fa riferimento.
    Con il codice che hai modificato tu funziona, è proprio quello che stavo provando a fare. Io lo stavo modificando inserendo

    for (byte curTbl = 0; curTbl < 3; curTbl ++)
    {
    Table t= (Table)(FindControl("Table" + (curTbl + 1).ToString()));
    t.Rows[0].Cells[0].Text = "Prova";
    }

    e eliminando l'array che a questo punto è praticamente inutile.

    Grazie mille per l'aiuto

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.