Visualizzazione dei risultati da 1 a 8 su 8

Discussione: hashtable e visibilita

  1. #1

    hashtable e visibilita

    ciao a tutti.
    Ho un problemino con un HashTable e con la sua visibilita.

    ho creato un oggetto dove dichiaro in hash comune a tutto l'oggeto (senza incapsularlo pero).

    inun metodo, uso l'hash per caricarlo con ele coppie chiave-valore, come solito

    nella form, vado a richiamare il metodo per fargli eseguire il caricamento con dei valori passati da me (sino a qui non ci sono problemi da nessuan parte)

    il problema si presenta quando in un altro metodo, richiamo nuovamente l'Hash per leggerne i valori...
    se non lo dichiaro new, mi dice che non è inizializzato, se lo dichiaro new mi diche che è vuoto (ovviamente.,..)

    non so più come girarlo...

    idee?

    posto sotto il codice a titolo di esempio

    /*nella classe*/
    using System.Collections;

    public class ConDB
    {
    public Hashtable myHas; //questo non funziona e mi da il problema

    public Hashtable Sortite = new Hashtable (); //questo invece funziona perche usato per ritornare un valore dal metodo che carica i dati nell'Hashtable


    public Hashtable NuovaSortita()
    {
    //qui uso il primo hash e lo carico di dati

    Sortite.Add (ruota , valore);

    return Sortite;
    }
    }


    /*nella pagina */

    protected void eseguiestrazione_Click(object sender, EventArgs e)
    {
    ConDB storico = new ConDB();
    ConDB casuali = new ConDB();


    // attivo un metodo per il calcolo di una serie di numeri random.
    string rnd;


    ltEstratti.Text = "<Table>";


    for (int i = 0; i < 11; i++)
    {
    rnd = casuali.SortRandomNum();
    string[] numeretti = rnd.Split(';');
    ltEstratti.Text += "<tr><td>" + Ruote[i] + "</td>";
    storico.Ruota = Ruote[i].ToString();
    storico.Valore = rnd.ToString();

    //qui l'hash viene caricato regolarmente
    storico.myHas = storico.NuovaSortita();

    for (int x = 0; x < numeretti.Length ; x++)
    {
    ltEstratti.Text +="<td>" + numeretti[x] + "</td>";
    }
    ltEstratti.Text += "</tr>";

    }
    ltEstratti.Text += "</Table>";

    }

    protected void pubblica_Click(object sender, EventArgs e)
    {
    // carico data, ruote e numeri nello storico

    ConDB storico = new ConDB();

    string qr;
    bool resoconto;

    //qui non mi vede l'hash e mi da errore
    foreach (DictionaryEntry de in storico.myHas)
    {
    qr = "Insert into Storico (";
    qr += "HData, HRuota, HNumeri";
    qr += ") values ('";
    qr += dataestrazione.ToString()+ "', '";
    qr += de.Key + "', '";
    qr += de.Value + "'";

    resoconto = storico.ExecuteNonQuery(qr);
    }

    }

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Primo problema: Gli oggetti vanno sempre inizializzati e visto che le hashtable sono oggetti, prima di essere usate vanno inizializzate. sempre. Poi, questa è una "best pratice", non tenere campi public, trasformali in proprietà

    codice:
    public class ConDB
    {
    public Hashtable myHas { get;set; }
    
    //nel costruttore della classe istanzi tutti gli oggetti che devono essere istanziati.
    public ConnDB()
    {
        myHas = new Hashtable (); 
    }
    Secondo Problema: eseguiestrazione e pubblica sono due metodi separati che vengono richiamati nell'ambito di due richieste http separate e che LOCALMENTE istanziano un oggetto ConnDB i quali avranno la propria hashtable che nascerà e morirà nell'ambito dello scope della singola funzione. Non risolvi il problema nemmeno se dichiari ConnDB a livello pagina perche come ti ho detto prima siamo in asp.net e le due funzioni vengono richiamate nell'ambito di due richieste http diverse.
    Il problema si risolve o accorpando i due metodi in un unico metodo, o implementando una logica di persistenza di myHash (anche in un file di testo, se sono dati temporanei), o (sconsigliatissimo ma molto piu semplice ed è la scelta preferita di chi è alle prime armi) memorizzare in "eseguiestrazione" l'oggetto storico nella Session e ripescarlo da li in "pubblica".

    codice:
        Session["storico"] = storico; //salvo lo storico nella session
    ...
        ConnDB storico = (ConnDB)Session["storico"];  //lo ripesco dalla session

  3. #3
    Grazie per i consigli e l'aiuto.

    Siccome si tratta di una hash temporanea, destinata a essere ricostruita tutte le volte che la pagina viene ricaricata, forse potrei usare la Session, anche se sconsigliato... prima di fare altro la pulisco cosi sono tranquillo e non occupo memoria inutilmente...

    Emanuele

  4. #4
    Nel costruttore della classe posso mettere anche più componenti giusto?

    per esempio metter due o tre hash, ArrayList, o altri oggetti che devo inizializzare...

  5. #5
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    certo. Se una classe fa uso di piu oggetti questi vanno tutti istanziati e il posto giusto per farlo è il costruttore della classe.

  6. #6
    ripropongo il problema perchè non sono riuscito a sfruttare il tuo suggerimento.
    Ho creato nella mia classe l'HASH e poi dopo averlo caricato l'ho passato alla Session.
    Il problema è quando nell'altra pagina cerco di recuperare l'HASH dalla session...

    ho provato a inizializzare una variabile come un nuovo HASH e a caricare in quello i valori dalla session, ma non c'è stato verso. Mi dava sempre un errore di conversione, sia che io cercassi di farne un casting implicito sia una conversione esplicita.

    Ma gli oggetti collections, non si possono passare come gli altri oggetti?

  7. #7
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    o sbagli il tipo durante il cast oppure dentro l'oggetto c'è qualcosa di non serializzabile. difficile da indovinare: serve il tipo di exception che ti solleva e i pezzi di codice di salvataggio e di recupero dalla session.

  8. #8
    grazie...
    adesso sto provando in modo diverso, perchè forse ho fatto un passaggio di parametri fra le parti non proprio ortodosso in c# (derivato da VB6)...
    se non riesco provo a postare codice e report di errore.

    grazie mille

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.