2011-11-16 14 views
19

Ho un controllo utente che utilizza un controllo utente, tra gli altri controlli.Tutti i controlli sono nulli all'interno di usercontrol

Nel file ascx Ho il seguente codice:

<%@ Register TagPrefix="tag" Namespace="some.name.space" Assembly="some.assembly" %> 
<tag:control ID="test" runat="server" /> 

Nel mio metodo Page_Load, cerco di impostare una proprietà su di prova in questo modo:

test.Text = "Hello World!"; 

Questo imposta in realtà la proprietà Text di un controllo letterale nel mio controllo utente test.

Questo genera un'eccezione:

riferimento non impostato a un'istanza di un oggetto

Quando si tenta di impostare il

lblTest.Text = value; 

L'oggetto che è nullo è lblTest.

Non sto aggiungendo il controllo utente correttamente? Dovrei - o devo farlo - specificare la proprietà Src quando registro un Tag? Se è così, dovrei registrare tutti gli usercontrol che uso?

Ciò comporta inoltre il non caricamento di controlli in usercontrol e tutti i controlli sono nulli all'interno di usercontrol.

risposta

27

Se il controllo utente è nel progetto corrente, allora avete bisogno di includere lo src nell'istruzione registro:

<%@ Register TagPrefix="uc1" TagName="NavTop" Src="controls/NavTop.ascx" %> 

Tuttavia, se si utilizza questo controllo utente in più di una pagina, allora si può anche registrarlo nel web.config:

<system.web> 
    <pages> 
    <controls> 
     <add tagPrefix="uc1" tagName="NavTop" src="~/controls/NavTop.ascx" /> 
    </controls> 
    </pages> 
</system.web> 

Un altra cosa di essere a conoscenza di: ci sono momenti in cui il designer di visual Studio non "vede" le modifiche ai controlli sulla pagina se si fa solo i cambiamenti vista sorgente. Se si modifica un nome di controllo, ad esempio, si potrebbe finire con un controllo con il nuovo nome in ascx ma un riferimento a un controllo con il vecchio nome nel file di progettazione. In fase di runtime, ciò comporta la nullità della proprietà del file di progettazione.

Dopo essere stato masterizzato da questo numero di volte, se applico qualche modifica nella vista di origine, controllo che il file del designer sia stato aggiornato correttamente o che io passi alla vista del disegno, apportare una piccola modifica, quindi salva la pagina/controllo utente.

+1

Grazie a @competent_tech La cosa che ho notato della registrazione dei controlli nel web.config è se un controllo è un controllo composito di controlli all'interno della stessa directory - ci sarà un errore. Se qualcuno me lo può spiegare, mi piacerebbe sapere perché è così. – VFein

5

Il problema qui è in genere dovuto alla meccanica di caricamento dei controlli utente, che vengono caricati dopo la pagina in genere. Di conseguenza, i controlli non sono ancora stati inizializzati sul tuo usercontrol (causando il riferimento null) durante il metodo di caricamento della pagina contenente. Un modo per ovviare a questo è semplicemente creare e impostare una proprietà su usercontrol e fare in modo che usercontrol leghi/popola la propria UI nel suo metodo Page_Load.

Qualcosa di simile a questo:

//Page 
protected void Page_Load(object sender, EventArgs e) 
{ 
    test.Text = "Hello World!"; 
} 

//User Control 
public string Text {get; set;} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    lblTest.Text = Text; 
} 
1

Si prega di provare a mettere il codice in caso di Page_PreRender pagina. Funzionerà per te.

+0

Il problema con l'utilizzo di PreRender per il popolamento dei controlli è se ci sono eventi sul controllo che interagiscono con altri controlli, i dati saranno mancanti a meno che non vengano popolati durante il caricamento. Se si popolano i controlli durante il caricamento, i dati saranno accessibili durante il pre-rendering. Carica -> Eventi Fuoco -> PreRender. PreRender dovrebbe essere usato quando si vuole assicurarsi che i dati non siano stantii (magari modificati da un evento). –

+0

Si noti che Page.PreRender si verifica dopo la pagina. Caricamento e qualsiasi controllo sulla pagina che attiva i propri eventi Load ... before a Page effettivamente rendering. È l'ultima possibilità di legare i dati ai controlli. –

+0

Questo non ha funzionato per me –

1

Ho avuto questo problema quando stavo aggiungendo un controllo utente nel codice dietro la strada sbagliata. Devi usare il metodo Page.LoadControl per inizializzare il controllo che non puoi semplicemente usare nuovo.

 //WRONG 
     UserControls.BingoCardPage bcp = new UserControls.BingoCardPage(); 
     form1.Controls.Add(bcp); 
     //RIGHT 
     UserControls.BingoCardPage bcp = (UserControls.BingoCardPage)Page.LoadControl("~/UserControls/BingoCardPage.ascx"); 
     form1.Controls.Add(bcp); 
Problemi correlati