qualcosa come
Dim c = CType(Me.FindControl("Controllo_utente1"), Type.GetType(controllo_utente1))
Me.Label1.Text = c.Testo

era questo che intendevi? non dover sapere a priori il tipo del control?

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
68 messaggi dal 05 dicembre 2002
www.tecnohome.it
ciao pietro, per aver accesso alle proprieta,methodi publiche di un usercontrol si puo fare solamente utilizando reflection. Non puoi accedere alle proprieta,methodi di un usercontrol perche I tipi del usercontrol non si conoscono durante il tempo di compilazione. Lo
usercontrol non e precompilato come sai.

Allora in poche parole, reflection e semplicamente il modo di conoscere i tipi di un ogetto durante runtime.

Ti faccio un esempio su come si usa:
-------------------------------------------

Il codebehind del tuo usercontrol:

Public ReadOnly Property Testo()

Get

Return Me.textbox1.Text

End Get

End Property
-------------------------------------------------------------------
La tua pagina aspx:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb"

Inherits="testaspx1.WebForm1"%>
<%@ Register TagPrefix="webcontrol1" TagName="webusercontrol1"
Src="webusercontrol1.ascx" %>
<html>
<head>
<title>WebForm1</title>
</head>
<form id="Form1" method="post" runat="server">
<webcontrol1:webusercontrol1 id="webcontrol1"
runat="server"></webcontrol1:webusercontrol1>
<asp:Button ID="btnclickme"
Runat="server"></asp:Button>
<asp:Label ID="lblshowme"

Runat="server"></asp:Label>
</form>
</body>
</html>
-------------------------------------------------------------------
il codebehind della tua pagina aspx:
Imports System.Reflection
Public Class WebForm1
Inherits System.Web.UI.Page
Protected WithEvents btnclickme As System.Web.UI.WebControls.Button
Protected WithEvents lblshowme As System.Web.UI.WebControls.Label
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

End Sub

Private Sub btnclickme_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles btnclickme.Click
'prima dichiara un controllo
Dim Myusercontrol1 As Control
'poi assegnialo al tuo usercontrol
Myusercontrol1 = Page.FindControl("WebControl1")
'crea un variable type cosi dopo lo assegni al type del usercontrol
'gia riferito
Dim Myusercontrol1type As Type
Myusercontrol1type = Myusercontrol1.GetType()
'adesso stiamo per accedere ad una proprieta del usercontrol
'se questo e un metodo allora dichiari methodo ecc.
'in questo esempo io voglio acesso ad una proprieta,
'e cosi dicharo come PropertyInfo
'se era un methodo allora dichiara MethodInfo
Dim Myusercontrol1property As PropertyInfo
'attentione che e' case sensitive, nota che "T" di Testo e maiuscolo
'come lo hai definito nel usercontrol.
Myusercontrol1property = Myusercontrol1type.GetProperty("Testo")
lblshowme.Text = Myusercontrol1property.GetValue(Myusercontrol1, Nothing)

End Sub
End class
-----------------------------------------------------------------------

Adesso hai avuto accesso ad una proprieta del tuo usercontrol.Poi anche fare lo stesso con i methodi, cioe invokare dei methodi nel tuo usercontrol anzi che chiamare e settare proprieta.
Nota: non dimenitcare di importare il namespace system.reflection :P

Nei documenti di vs.net ce scritto che reflection deve essere usato con
prudenza, solo quando ne hai bisognio perche consuma risorse :P

sei hai dei dubbi, chiedi pure :)
ciao


Alessandro
MCP
3.939 messaggi dal 28 gennaio 2003
Per chocoIate:

Ti ringrazio della risposta. Lo studierò, anche perchè quello che scrivi non lo sapevo proprio.

Ciao


Funziona perfettamente.
Modificato da pietro09 il 19 febbraio 2003 09.13 -
3.939 messaggi dal 28 gennaio 2003
Amici, io sono più confuso che mai e spero proprio che mi aiutaterete:

NON CAPISCO PERCHE' QUESTO CODICE FUNZIONI!!!
VISTO ANCHE LA COMPLESSITA' DELLE RISPOSTE PRECEDENTI

Ripeto. Ho un semplicissimo controllo utente con una proprietà chiamata Testo
controllo_utente.ascx
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="controllo_utente.ascx.vb" Inherits="corso_apogeo.controllo_utente" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<asp:TextBox id="TextBox1" runat="server" Width="355px"></asp:TextBox>



Codebehind="controllo_utente.ascx.vb"
Public MustInherit Class controllo_utente
    Inherits System.Web.UI.UserControl
    Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox

    Public Property Testo$()
        Get
            Return Me.TextBox1.Text
        End Get
        Set(ByVal Value$)
            Me.TextBox1.Text = Value
        End Set
    End Property


    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Inserire qui il codice utente necessario per inizializzare la pagina
    End Sub

End Class



pagina di prova: prova_controllo_utente_2.aspx
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="prova_controllo_utente_2.aspx.vb" Inherits="corso_apogeo.prova_controllo_utente_2"%>
<%@ Register TagPrefix="uc1" TagName="controllo_utente" Src="controllo_utente.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
  <HEAD>
    <title>prova_controllo_utente_1</title>
    <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
    <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    <LINK href="../../../../Stile.css" type="text/css" rel="stylesheet">
  </HEAD>
  <body>
    <form id="Form1" method="post" runat="server">
      <uc1:controllo_utente id="Controllo_utente1" runat="server"></uc1:controllo_utente>
      <P><asp:Button id="Button1" runat="server" Text="Imposta valore controllo utente" Width="270px"></asp:Button></P>
      <P><asp:Button id="Button2" runat="server" Text="Recupera valore controllo utente" Width="270px"></asp:Button></P>
      <P><asp:Label id="Label1" runat="server"></asp:Label></P>
    </form>
  </body>
</HTML>



Codebehind="prova_controllo_utente_2.aspx.vb"
Public Class prova_controllo_utente_2
    Inherits System.Web.UI.Page
    Protected WithEvents Button1 As System.Web.UI.WebControls.Button
    Protected WithEvents Button2 As System.Web.UI.WebControls.Button
    Protected WithEvents Label1 As System.Web.UI.WebControls.Label

    Protected Controllo_utente1 As controllo_utente

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Controllo_utente1.Testo = Date.Now().ToString
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.Label1.Text = Controllo_utente1.Testo
    End Sub

End Class

68 messaggi dal 05 dicembre 2002
www.tecnohome.it
ciao, funziona in che senso?
Non puoi instanziare la classe del tuo usercontrol. E una classe "abstract". Vedi la dichiarazione sul tuo usercontrol. Ce scritto "Mustinherit". Una classe di questo tipo non puo essere instanziato. Se non riesci ad instanziarlo, come fai a passare proprieta?
Non funziona, e il methodo che ti ho dato e molto semplice, perche cerci alternative. secondo me l'unico modo e usare reflection :P

Alessandro
MCP
3.939 messaggi dal 28 gennaio 2003
chocoIate ha scritto:
ciao, funziona in che senso?
Non puoi instanziare la classe del tuo usercontrol. E una classe "abstract". Vedi la dichiarazione sul tuo usercontrol. Ce scritto "Mustinherit". Una classe di questo tipo non puo essere instanziato. Se non riesci ad instanziarlo, come fai a passare proprieta?
Non funziona, e il methodo che ti ho dato e molto semplice, perche cerci alternative. secondo me l'unico modo e usare reflection :P


Carissimo Alessandro, vedi, io provengo da ASP. Non conosco asp.net e lo sto studiando.
La tua risposta è stata trasformata in un esempio funzionante e l'ho archiviato per uso futuro.

Ma a me piace pure capire le cose:

Se non usi il codice sottostante, puoi utilizzare il tuo controllo utente in modo molto semplice:

nomeControlloUtente.Proprietà = valore
variabile = nomeControlloUtente.Proprietà

Questo è riportato in letteratura, compreso la documentazione di vs.net. (A proposito, non si parla certo di reflection, o almeno, io non l'ho visto)

I problemi nascono quando usi il controllo utente in una pagina che usa il codice sottostante.
La documentazione di vs.net sembra suggerire che per fare ciò, bisogna creare una istanza del controllo utente a livello di programmazione. Non mi dilungo, ma, seguendo il suggerimento ho creato un esempio di prova e ti assicuro che funziona.

Ma non basta, ecco il suggerimento di Daniele. E' molto meglio del suggerimento della documentazione di vb.net (per me, naturalmente). Faccio un esempio, funziona, archivio e ringrazio di cuore chi me lo ha fornito.

Ma non è finito. Faccio un esempio, vedo che funziona, lo spedisco chiedendo perchè funziona (in teoria, secondo te non dovrebbe funzionare) e tu ti ostini a dire che non funziona.

Riprendo l'esempio, al controllo utente aggiungo un'altra proprietà, vado alla pagina che contiene il controllo utente, lo istanzio e funziona. Inoltre, quando scrivo: controllo_utente. si apre la finestrella e mi fa vedere l'elenco delle proprietà.

Allora, concludendo, se la teoria non ha riscontro nella realtà, è la teoria che non funziona e che deve essere cambiata, e non certo il contrario.

Ciao, Pietro
68 messaggi dal 05 dicembre 2002
www.tecnohome.it
ciao pietro,
avevi ragione, funziona :)
Anzi hai risposto alla tua domanda initzile do solo. La mia risposta con l'esempio di reflection funziona pure, pero e tutta unaltra cosa e sarebbe stato uno spreco di risorse se lo avevi usato :P

Allora per primo mi scuzo per la confuzione che ho fatto. La risposta di daniele era giusto pure quello.


Poi se volesi fare load ad un User control durante runtime, allora si fa in questo modo :
nella pagina aspx, devi prima riferire al contorllo usando il tag reference :
<%@ Reference Control="MyUsercontrol.ascx" %>

Poi nel codebehind della pagina :
Dim c1 As UserControl = LoadControl("MyUserControl.ascx")
CType(c1, MyUserControl).Testo = "hi there"
Page.Controls.Add(c1)

---------------------------------------------------------------------------------------
Se invece il tuo controllo ce a design time, allora lo fai nel modo che hai fatto tu sul tuo esempio. E il modo correto per accedere alla proprieta, funzioni, methodi del tuo usercontrol.
Ignora il mio ultimo post dove ho detto che il usercontrol deve essere istanziato perche quando metti l'usercontrol nella tua pagina, la pagina immeditamente heredita tutte le proprieta del tuo controllo :)

-------------------------------------------------------------------------------------------------------------------
Allora reflection in fine: Ci sono molti casi quando viene utile, oppure non si puo fare senza reflection. Nei usercontrol per esempio viene usato reflection quando il controllo non e precompilato, e come hai visto nel esempio che ho fatto, ha funzionato pero in quel caso era inutile usare reflection si come il usercontrol nel modo che lo stai usando e precompilato.

ci sono casi quando l'usercontrol non viene precompilato, ad esempio quando usi il tag "src" nel control tag prefix(<%control%>), oppure invece di usare il codebehind metti tutta la tua logica nel .ascx usando il <script runat="server"></script>tag. In questi casi, per avere accesso alle proprieta del usercontrol devi perforza usare reflection.

Nel tuo caso non ce bisognio, fai bene ad accedere alle proprieta come stai facendo :P

Alessandro
MCP
3.939 messaggi dal 28 gennaio 2003
Non c'è nulla di meglio di una discussione tra amici.

Ciao, Pietro

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.