5 messaggi dal 08 dicembre 2005
Salve a tutti, vorrei chiedere ai presenti se riescono a darmi una mano con questo problema:
In pagina a.aspx ho la seguente struct
public struct nodo
    {
        //predecessore, distanza dall'origine, coordinate, espanso
        public int p, d, x, y, expanded;
        public string name;
        
    }

che viene riempita con i dati.

Ho bisogno di passare intera struct ad un altra pagina. Suppongo che la via + facile sarebbe usare le session
//nodi è la struct nodo riempita
Session["nodi"] = nodi;


Il problema è seguente: non riesco ad estrarre la struct nodi dalla session alla pagina seguente.

I dati vengono trasmessi correttamente (secondo il debugger), quindi il problema sarebbe nel modo in cui cerco di trattarli

Avevo provato seguenti varianti (provengo dall'ambiente php e uso da pochissimo c# e asp, quindi siate clementi :P)

       
nodo[] nodi = new nodo[110];
nodi = (nodo[]) Session["nodi"];


oppure
nodo[] nodi = (nodo[])Session["nodi"];


I due tentativi precedenti mi davano errore System.InvalidCastException: Unable to cast object of type 'nodo[]' to type 'nodo[]'.

provando
object nodi = Session["nodi"];

La parte di dichiarazione va bene, ma se cerco di fare qualcosa come
int x = nodi[1].x;
L'errore restituito è

Compiler Error Message: CS0021: Cannot apply indexing with [] to an expression of type 'object'

Dove che sbaglio?
Grazie
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Quando riprendi i dati devi scrivere semplicemente:
nodo nodi; 
nodi = (nodo) Session["nodi"];

Ciao
5 messaggi dal 08 dicembre 2005
Nope nn va nemmeno cosi.
Questo è il codice della pagina che dovrebbe disegnare il grafo:
public partial class Grafo : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        nodo nodi;
        nodi = (nodo)Session["nodi"];
    }    
}
public struct nodo
{
    //predecessore, distanza dall'origine, coordinate, espanso
    public int p, d, x, y, expanded;
    public string name;
}


Mi da errore
Exception Details: System.InvalidCastException: Specified cast is not valid.

Cmq credo di aver individuato il problema: asp nn riesce a capire che la struct nodo della pagina che disegna il grafo è la stessa della pagina di prima, quindi va in palla.

Se uso la dichiarazione
object nodi = Session["nodi"]; (che va) come faccio poi ad usare un membro di un nodo? (cioe nodi[1].x mi da errore)
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Ti premetto che io odio le "struct"

Il passaggio in Session non è possibile con lo struct se non definisci un costruttore di default (avevo dei dubbi su questo punto, e me ne sono accertato proprio pochi istanti fa).

Il problema è come hai fatto a memorizzare nella Session uno struct senza costruttore? Se io scrivo:

nodo nodi;
nodi.p=1
....
Session["nodo"]=nodi

Ottengo ovviamente un errore. Puoi postare il codice che utilizzi per la definizione e la memorizzazione nella session della struct?

Ciao
5 messaggi dal 08 dicembre 2005
Si certo :P
La struttura è quella che ho scritto prima, la dichiarazione è seguente:

nodo[] nodi;
......
poi in Page_Load
this.nodi = new nodo[MAXNODI];
..................

Successivamente in una funzione viene riempita a random
for (i = 0; i < numNodi; i++)
{
nodi[i].x = rnd.Next(30,650);
nodi[i].y = rnd.Next(30,425);
nodi[i].name = i.ToString();
}
............
Ed infine
Session["nodi"] = nodi;

Il passaggio ad altra pagina avviene correttamente (questo l'ho verificato con il debugger facendo watch su Session["nodi"] Il problema è appunto come estrarli in un altra pagina :/ (poiché all'interno della stessa pagina non è un problema, ma mi da degli errori solo nelle altre pagine :/)

Tutto questo è perché devo generare un disegno di tutti nodi appunto (ha a che fare con Dijkstra e calcolo dei minimi percorsi da un punto all'altro).

Altra strada che sto cercando di seguire è quella di costruire un immagine Bitmap nella prima pagina e memorizzare quella nella sessione, per poi ripescarla e visualizzare sullo schermo. Ma anche cosi nun va (wrong parameter bla bla), anche se x altri ragioni :(

Edit:
in pratica devo fare questo:http://aspspider.net/alekc/ (basta che metti num di nodi<100 e grado < a numnodi, e clicchi su ok)

Attualmente programma crea un file fisico su hd e lo visualizza (soluzione temporanea x verificare che le cose funzionavano)
Modificato da Alekc il 10 dicembre 2005 15.18 -
5 messaggi dal 08 dicembre 2005
Bene. A quanto pare sono riuscito a risolvere il mio problema memorizzando immagine nella session con ausilio di MemoryStream e ripescandola successivamente da un altra parte.
Cmq se qualcuno sa la risposta alla mia domanda iniziale, sarei curioso di sapere il motivo per cui nn mi funzionava il cast.

3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Alekc <Alekc> ha scritto:
Si certo
La struttura è quella che ho scritto prima, la dichiarazione è

Ehi, ma potevi dirlo prima che era un array di struct:

nodo[] nodi=new nodo[2];
nodi[0].p=1;
nodi[1].p=2;
Session["nodi"]=nodi;

nodo[] copia=(nodo[])Session["nodi"];
Response.Write(copia[1].p);

Testato ora e funziona correttamente.

Altra strada che sto cercando di seguire è quella di costruire un immagine Bitmap nella prima pagina e memorizzare quella nella sessione, per poi ripescarla e visualizzare sullo schermo.

Attento al consumo eccessivo di memoria per la memorizzazione della bitmap.
Ciao
Modificato da andrewz il 10 dicembre 2005 16.39 -
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Alekc ha scritto:
Bene. A quanto pare sono riuscito a risolvere il mio problema memorizzando immagine nella session con ausilio di MemoryStream e ripescandola successivamente da un altra parte.
Cmq se qualcuno sa la risposta alla mia domanda iniziale, sarei curioso di sapere il motivo per cui nn mi funzionava il cast.


Come detto nel messaggio precedente attento al consumo di memoria.

Ciao

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.