Aggiungo dinamicamente i controlli utente Web a una pagina. L'utilizzo del metodo LoadControl
che richiede solo un percorso virtuale che punta a .ascx
funziona molto bene. Tuttavia, il sovraccarico di LoadControl
che accetta un tipo e un array di parametri mi sta causando alcuni grattacapi.Carica il controllo utente a livello di codice utilizzando LoadControl (Type, Object())
Il controllo utente Web viene istanziato come previsto, ma i controlli contenuti nel controllo utente Web sono nulli e ottengo un'eccezione non appena provo a lavorare con essi. Strano, perché funziona quando si utilizza la prima versione di LoadControl
.
Il controllo utente Web, semplice, con un controllo Literal
:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="MyControl.ascx.vb" Inherits="MyControl" %>
<asp:Literal ID="myLiteral" runat="server"></asp:Literal>
codice I comandi dietro:
Public Class MyControl
Inherits System.Web.UI.UserControl
Public Property Data As MyData
Public Sub New()
End Sub
Public Sub New(data As MyData)
Me.Data = data
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
myLiteral.Text = Data.ID ' The Literal is null, but ONLY when I use the second LoadControl() method!
End Sub
End Class
E il relativo codice dalla .aspx
da cui sto cercando di caricare dinamicamente il controllo:
Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
Dim x = LoadControl(GetType(MyControl), New Object() {New MyData With {.ID = 117}})
Page.Controls.Add(x)
' Using LoadControl("MyControl.ascx") works as expected!
End Sub
Sembra che si stia invocando un costruttore su un oggetto già creato: come funziona? – jmoreno
@jmoreno Dato che i costruttori sono solo metodi statici con qualche confusione extra, funziona. –
Ecco una breve demo: http://ideone.com/IoqU2Z (il codice non funziona sulla maggior parte degli editor online perché richiede una certa richiesta di sicurezza, ma funziona con piena fiducia). –