Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di kumm
    Registrato dal
    Jun 2000
    Messaggi
    190

    [ASP.NET] un UserControl può lanciare una SUB della pagina Parent??

    Ciao ragazzi...
    totalmente neofita dell'argomento ho visto tantissimi post sull'argomento UserControl dove spiegate egregiamente come una pagina contenitore (l'aspx) possa invocare metodi del UserControl (l'ascx).

    Il mio problema è esattamente l'opposto! o credo.....

    Ho un UserControl di nome "form.ascx" con un form di ricerca e al click del pulsante "cerca" la pagina aspx deve SOSTITUIRE il suddetto UserControl per inserire il nuovo "report.ascx"

    La soluzione pensavo fosse all'evento click del pulsante "cerca" di "form.ascx" invocare una funzione della pagina aspx (quindi dall'UC verso la pagina aspx) che crea la query e mi cambia lo UserControl... giusto??

    help!!

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Io faccio cosi', dichiara un evento nel tuo UserControl form.ascx :

    codice:
        Public Event CercaClick(ByVal sender As Object, ByVal e As EventArgs)
        Protected Overridable Sub OnCercaClick(ByVal e As EventArgs)
            RaiseEvent CercaClick(Me, e)
        End Sub
    
        Private Sub btCerca_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btCerca.Click
            OnCercaClick(e)
        End Sub
    Poi potrai gestire l'evento click del pulsante cerca, dalla pagina che lo ospita:

    codice:
        Private Sub NomeControllo_CercaClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NomeControllo.CercaClick
        End Sub
    per fare quello che vuoi..

  3. #3
    Utente di HTML.it L'avatar di kumm
    Registrato dal
    Jun 2000
    Messaggi
    190
    Intanto grazie 1000 djciko per la risposta a dir poco esaustiva!

    ho subito messo in pratica quanto consigliato solo ke essendo ancora neofita come un'ora fa ho riscontrato subito un problemino....

    Io carico gli UserControls a runtime con il LoadControl su un PlaceHolder che sta "sull'unica" pagina aspx.

    Mi manca "qualcosa" per istanziare lo UserControl per poter scrivere correttamente la parte "Handles NomeControllo.CercaClick"....

    ...praticamente nella pagina aspx nn vedo lo UserControl e quindi nemmeno l'evento CercaClick

    sarà una stupidata... ma sto iniziando adesso

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Prova così, dichiara nel Code-Behind della pagina che ospita lo UserControl:
    codice:
    Protected WithEvents form as New NomeClasseUserControl
    poi, come credo che tu già faccia:
    codice:
    form = CType(LoadControl("form.ascx"), NomeClasseUserControl)
    PlaceHolder.Controls.Add(form)
    potrai cosi' gestire l'evento...(puoi anche controllare dalle DropDownList degli oggetti della pagina di Visual Studio, dovresti vedere il tuo evento CercaClick)
    codice:
        Private Sub form_CercaClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles form.CercaClick
            .
            .
            .
        End Sub
    fammi sapere se ho detto una cavolata

  5. #5
    Utente di HTML.it L'avatar di kumm
    Registrato dal
    Jun 2000
    Messaggi
    190
    Grazie ancora per l'aiuto prezioso ke mi stai dando!!

    Sono sicuro ke tu hai le idee molto kiare sull'argomento... ma io purtroppo no

    Allora ti spiego cosa sto facendo...

    Nella pagina aspx nel page_load ho una SELECT CASE pilotata da una variabile request.querystring e in ogni CASE c'è un LOADCONTROL del tipo: MioPlaceHolder.Controls.Add(LoadControl("pagine/mioUserControl.ascx"))

    (quindi non ho usato la notazione CTYPE e sopratutto NON AVREI IDEA di cosa scrivere dove tu dici "NomeClasseUserControl"

    per ovviare a questo ho fatto:
    1. ho creato una classe in un file a parte e l'ho kiamata "formRicerca"
    codice:
    Public Class formRicerca
        Inherits System.Web.UI.UserControl
    
        Public Event CercaClick(ByVal sender As Object, ByVal e As EventArgs)
    
    Protected Overridable Sub OnCercaClick(ByVal e As EventArgs)
            RaiseEvent CercaClick(Me, e)
        End Sub
    End Class
    2. Nello UserControl ho specificato "Inherits formRicerca"
    ed ho inserito
    codice:
    Protected Sub linkCerca_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles linkCerca.Click
            OnCercaClick(e)
        End Sub
    3. Temporaneamente (visto ke gli usercontrol devono essere caricati dinamicamente) ho scritto nella pagina aspx PRIMA del page_load:
    codice:
        Protected WithEvents mioUser As UserControl = CType(LoadControl("pagine/mioUserControl.ascx"), formRicerca)
    e finalmente (sempre nella pagina aspx):
    codice:
    Private Sub reportImmobili() handles mioUser.xxxxxx
    End Sub
    solo ke dove ho messo xxxxxx NON mi fa vedere l'evento CercaClick ma solo quelli standard tipo Databinding, Disposed ecc.....

    Le domande nascono spontanee:
    1. E' normale ke devo creare una classe a parte e far ereditare da questa lo UserControl visto ke l'aspx nn la vede direttamente?

    2. devo staticamente dikiarare la UserControl nella pagina aspx (protected withevents ecc....) considerando ke gli UserControls saranno una decina??

    3. perché nn riesco a vedere gli eventi dello UserControls dalla pagina aspx??


  6. #6
    Utente di HTML.it L'avatar di kumm
    Registrato dal
    Jun 2000
    Messaggi
    190
    ok ok.... dimentikiamo la domanda 3 in quanto avevo sbagliato la dikiarazione della variabile "mioUser" come UserControls e NON come "formRicerca"... MEA CULPA!!!

    ma il resto sussiste!!!


  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887

    mi sono perso


    1. Il code behind con una classe esplicita è una buona tecnica (il codice inline è sconsigliato), e va usata anche per gli usercontrol, oltre alle normali pagine aspx...Se usi visual studio sara' tutto piu' semplice una volta che ci hai fatto la mano.

    2. Gli unici modi (che io conosco) per gestire un evento dal di fuori dell'usercontrol sono quelli che ti ho scritto...Quindi se non vuoi (o non puoi) usare la direttiva Register, mi sembra l'unica soluzione per vedere gli eventi default e quelli da te creati per il tuo controllo utente...

    Per NomeClasseUserControl intendevo appunto formRicerca

    Poi, NEL CODE-BEHIND della pagina aspx:

    codice:
    Protected WithEvents miaForm As New formRicerca
    Nel page_load:
    codice:
    miaForm = CType(LoadControl("pagine/mioUserControl.ascx"), formRicerca)
    PlaceHolder.Add etc...
    Questo per tutti i casi e per tutti gli usercontrol

    Poi, prova a guardare le due DropDownList dell'elenco oggetti della pagina...In quella a sinistra dovresti vedere miaForm, selezionandola dovresti vedere, in quella a destra, l'evento CercaClick....
    Selezionandolo VS ti crea la sub per gestire l'evento

  8. #8
    Utente di HTML.it L'avatar di kumm
    Registrato dal
    Jun 2000
    Messaggi
    190

    Non mi riferivo al code-behind

    primo....

    il problema citato prima della necessità di creare una classe a parte e far ereditare da questa lo UserControl visto ke l'aspx nn la vede direttamente, non intendeva il code-behind.... mi spiego meglio.

    Quando creo un nuovo UserControl questo nn è altro ke una classe ke eredita da "System.Web.UI.UserControl" giusto?
    Ok...

    Ipotizziamo ke sia questa (ke è tra l'altro il code-behind della parte in html):

    codice:
    Public Class mioUserControl
        Inherits System.Web.UI.UserControl
    
    End Class
    Il problema è ke la classe si kiama "mioUserControl", ma la pagina ASPX NON LA VEDE!!! quindi non posso istanziare con protected withevents ecc....

    Se invece creo una classe "pippo" a parte (un file.VB) che eredita da System.Web.UI.UserControl e allo UserControl di prima dico di ereditare da "pippo" e non + da "System.Web.UI.UserControl" allora la pagina ASPX mi vede "pippo" e posso istanziare una variabile di tipo "pippo"!!!!!!

    ----------------
    secondo...

    Devo necessariamente inserire una dicitura del tipo:
    Protected WithEvents ....
    per ogni usercontrol??

    Quindi se ho 20 userControl dovrò inserire 20 righe nella pagina aspx riferite a ogni UserControl??

    ----------------------

    Non mi abbandonare proprio adesso....

  9. #9
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Se hai creato una solution ed un progetto in Visual Studio, ed aggiungi un UC, lui crea HTML e CodeBehind.

    Facendo poi (di solito) nelle pagine aspx "NomeAssemblyProgetto."
    dovrebbe darti anche (fra le altre) il nome della classe dello UC. Questo dovrebbe essere fatto cosi':

    mioUserControl.ascx:
    codice:
    <%@ Control Language="vb" AutoEventWireup="false" Codebehind="mioUserControl.ascx.vb" Inherits="NomeAssemblyDelProgetto.mioUserControl" %>
    
    <HTML>
    <HEAD>
    .
    .
    .
    mioUserControl.ascx.vb:
    codice:
    Imports System
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.HtmlControls
    .
    .
    
    
    Public Class mioUserControl
        Inherits System.Web.UI.UserControl
    .
    .
    .
    Usi Visual Studio, giusto ?

  10. #10
    Utente di HTML.it L'avatar di kumm
    Registrato dal
    Jun 2000
    Messaggi
    190
    Perfetto!
    E' esattamente quello ke mi genera..

    si, uso VS2005

    Nel frattempo ho notato una cosa:
    Se il file .VB lo metto dentro la cartella APP_CODE allora le pagine aspx vedono le classi... altrimenti (come tutti i code-behind degli userControls) la pagina aspx nn li vede.

    Quando dicevo ke creavo una classe da far ereditare ho capito ke alla fine era solo perché questa classe stava dentro la cartella APP_Code che, appunto, permette alle pagine ASPX di leggere direttamente le classi....

    (ho fatto la prova a spostare un file di code-behind di un usercontrol in quella cartella e la pagina aspx vede la classe!!! solo ke la parte html dello usercontrol ovviamente nn funziona + e mi dà errori di context anke dopo aver aggiustato i path del code-behind....)

    ...nn ci sto capendo + nulla!!

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.