Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problemi con classi annidate

    ragazzi ho ancora dei grossi problemi nella gestione delle classi la situazione è la seguente

    ho una pagina .aspx che visualizza il codice html più un dataGrid

    poi ho il codebehind contenuto in un file .vb che contiene la sub Page_Load() e alcune dichiarazioni utilizzate nel file .aspx

    e finalmente arriviamo alle due mitiche classi (trasformate in dll)
    la prima si chiama dbAccess e contiene alcune funzioni che utilizzo per interagire con il db e la seconda classe che contiene delle funzioni Generali di utilizzo comune all'interno del software

    Ora io una di queste funzioni generali la utilizzo per visualizzare dei dati nel dataGrid e quindi nel codeBehind ho dichiarato
    public generaliLocale = new ASPNETGenerali.Generali()

    all'interno del file .aspx utilizzo una funzione che sta in generali con il seguente metodo
    generaliLocale.ControllaCategorie(Container.DataIt em("categoriamerceologica"))

    e l'errore che ottengo è il classico
    Riferimento a un oggetto non impostato su un'istanza di oggetto.

    l'errore è nella riga che richiama la funzione ControllaCategorie
    generaliLocale.ControllaCategorie(Container.DataIt em("categoriamerceologica"))

    la classe generali (ridotta ai minimi termini per ovvi motivi di spazio) è la seguente

    Imports System
    Imports Microsoft.VisualBasic
    Imports ASPNETAccess

    Namespace ASPNETGenerali
    Public Class Generali
    public Function ControllaCategorie(valoreId as object) As string
    IF VarType(valoreId) = VariantType.Null THEN
    return "Non Presente"
    ELSE
    Dim strSelect as string = "SELECT nomecategoria AS nomecategoria FROM tbcategoriamerceologica WHERE id = "& CINT(valoreId) &""
    dim objSelect = new ASPNETAccess.dbAccess()
    dim ritorna as string
    ritorna = objSelect.SelezionaValore(strSelect)
    return ritorna
    END IF
    END Function

    End Class
    End Namespace

    all'interno del codeBehind richiamo
    Imports ASPNETAccess
    Imports ASPNETGenerali

    da notare che l'errore è in questa porzione di codice
    Dim strSelect as string = "SELECT nomecategoria AS nomecategoria FROM tbcategoriamerceologica WHERE id = "& CINT(valoreId) &""
    dim objSelect = new ASPNETAccess.dbAccess()
    dim ritorna as string
    ritorna = objSelect.SelezionaValore(strSelect)
    return ritorna

    perchè provando a far stampare una semplice stringa il tutto funziona alla perfezione

    non so davvero dove sbaglio!
    le ho provate un po' tutte

  2. #2

    Re: Problemi con classi annidate

    Originariamente inviato da brutusin
    all'interno del file .aspx utilizzo una funzione che sta in generali con il seguente metodo
    generaliLocale.ControllaCategorie(Container.DataIt em("categoriamerceologica"))
    Perche' nel file aspx metti questo codice rischiando cosi che generaliLocale sia nullo? Faresti meglio a mettere il richiamo ad un componente esterno (una dll nel tuo caso) nel codebehind dopo esserti accertato che l'oggetto (generaliLocale) sia istanziato correttamente.
    ...da notare che l'errore è in questa porzione di codice...
    l'errore segnalato come detto non credo sia li. Cmq, nella funzione ControllaCategorie accetti un valore come parametro dichiarandolo Object per poi nel codice della funzione fare un cast a integer. Visto che il parametro e' sicuramente un integer perche non dichiari la funzione con il parametro gia' pronto es.
    codice:
    public Function ControllaCategorie(_valoreId as integer) As string
    Saluti a tutti
    Riccardo

  3. #3
    Perchè non ti crei un wrapper della classe nel codebehind. Dalla pagina aspx richiamerai un metodo della pagina che, dopo aver controllato se l'oggetto esiste, ne utilizza i metodi.

    Spero di essere stato chiaro.
    Ciao
    Kalman
    Kalman

  4. #4
    x Kalman
    non conosco il concetto di wrapper sinceramente
    puoi farmi un esempio?

  5. #5
    Crei una funzione che wrappa la funzione della tua classe.


    Public Fucntion MiaFunzione(Byval a as string)

    'qui controlla se generaliLocale è un oggetto
    'altrimenti lo instanzi

    return generaliLocale.ControllaCategorie(a)

    End fucntion

    In questo modo dalla pagina aspx richiami un metodo del tuo codebehind.

    Wrappare vuol dire costruire un involucro intorno all'oggetto che ti facilita il suo utilizzo. La stessa cosa quando fai la reference ad un oggetto come e ti crea il file Interop. Quello è il wrapper dell'oggetto.

    Spero di essere stato chiaro.
    Fammi sapere
    Ciao
    Kalman
    Kalman

  6. #6
    x riccardone

    tu hai scritto

    Faresti meglio a mettere il richiamo ad un componente esterno (una dll nel tuo caso) nel codebehind dopo esserti accertato che l'oggetto (generaliLocale) sia istanziato correttamente.

    ma come posso farlo?

    il problema è senza ombra di dubbio dovuto a questa riga di codice

    dim objSelect = new ASPNETAccess.dbAccess()

    vi posto un esempio di come la stessa funzione va in maniera divina

    public Function ControllaCategorie(valoreId as integer) As string
    IF VarType(valoreId) = VariantType.Null THEN
    return "Non Presente"
    ELSE
    'Dim strSelect as string = "SELECT nomecategoria AS nomecategoria FROM tbcategoriamerceologica WHERE id = "& CINT(valoreId) &""
    'dim objSelect = new ASPNETAccess.dbAccess()
    dim ritorna as string
    'ritorna = objSelect.SelezionaValore(strSelect)

    ritorna = "PROVA CATEGORIA"
    return ritorna
    END IF
    END Function

    sarò anche pesante però mi sembra strano che da una dll non si possa richiamare un metodo presente in un'altra dll soprattutto se quest'ultima è stata correttamente importata

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    per brutusin

    Sinceramente non capisco. La faccenda è quasi assurda. Dico, l'utilizzo di una classe.

    Allora, arrivati a questo punto ti suggerisco di estrarre i metodi dalla classe e metterli nel codice sottostante della pagina. Lì dovrebbero essere collaudati bene. Se funzionano, io costruirei una classe nello stesso file del codice sottostante del codice sottostante della pagina. Se tutto va bene e solo allora, metterei la classe in un nuovo progetto indipendente. :master:



    dimenticavo, Wrappare non significa assolutamente niente, nella lingua di Dante, naturalmente, in inglese, invece ... ma che ce ne frega dico io in inglese?
    Pietro

  8. #8
    Originariamente inviato da brutusin
    ...mi sembra strano che da una dll non si possa richiamare un metodo presente in un'altra dll soprattutto se quest'ultima è stata correttamente importata
    Questo post e' strano gia' a partire dal titolo "classi annidate". Una classe annidata e' semmai una classe dentro un'altra classe
    es.
    codice:
    Public Class Padre
        Public Class figlio
        End Class
    End Class
    Invece di mettere nella pagina aspx
    generaliLocale.ControllaCategorie(Container.DataIt em("categoriamerceologica"))
    metti nel codebehind una funzione simile alla seguente
    codice:
    public function ControllaCategorie(_categoriaMerceologica as integer) as string
    ' qui metti l'invocazione al componente esterno
    ' (per fare quello che fa potresti rendere shared
    ' il metodo ControllaCategorie ed evitare di dover usare
    ' una istanza di oggetto)
    dim m_generali as new ASPNETGenerali.Generali() 
    Return m_generali.ControllaCategorie(_categoriaMerceologica) 
    end function
    mentre nella pagina aspx metterai
    codice:
    <%# ControllaCategorie(Container.DataItem("categoriamerceologica")) %>
    Saluti a tutti
    Riccardo

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.