2011-11-16 16 views
19

Tengo un UserControl que usa un UserControl, entre otros controles.Todos los controles son nulos dentro de usercontrol

En el archivo ascx Tengo el siguiente código:

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

En mi método Page_Load, trato de establecer una propiedad en la prueba de este modo:

test.Text = "Hello World!"; 

En realidad, esto se define la propiedad de texto de un control literal en mi control de usuario test.

Esto produce una excepción:

referencia a objeto no establecida a una instancia de un objeto

Cuando se intenta establecer la

lblTest.Text = value; 

El objeto que es nula es lblTest.

¿No estoy agregando el control de usuario correctamente? ¿Debo -o debo hacerlo- especificar la propiedad Src al registrar una Etiqueta? Si es así, ¿tendría que registrar cada usercontrol que uso?

Esto también da como resultado que no se cargue ningún control en usercontrol y que todos los controles sean nulos dentro de usercontrol.

Respuesta

27

Si el control de usuario está en su proyecto actual, entonces es necesario incluir el src de la cuenta de registro:

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

Sin embargo, si se utiliza este control de usuario en más de una página, entonces se puede también registrarla en web.config:

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

otra cosa a tener en cuenta: hay momentos en que el diseñador de visual Studio no "ve" los cambios a los controles en la página si sólo hacer los cambios en vista de fuente Si cambia un nombre de control, por ejemplo, podría terminar con un control con el nuevo nombre en el archivo ascx, pero una referencia a un control con el nombre anterior en el archivo del diseñador. En tiempo de ejecución, esto dará como resultado que la propiedad del archivo de diseñador sea nula.

Después de haberme quemado varias veces, si realizo cambios en la vista de origen, o verifico si el archivo de diseñador se ha actualizado correctamente o si cambio a la vista de diseño, hago un cambio menor, luego guardar el control de página/usuario.

+1

Gracias @competent_tech Lo que noté sobre el registro de controles en el web.config es si un control es un control compuesto de controles dentro del mismo directorio - habrá un error. Si alguien puede explicarme eso, me encantaría saber por qué. – VFein

5

El problema aquí se debe generalmente a la mecánica de carga de los controles del usuario, que se cargan después de la página normalmente. Por lo tanto, como resultado, los controles aún no se han inicializado en su usercontrol (lo que provoca la referencia nula) durante el método que contiene page_load. Una forma de evitar esto es simplemente crear y establecer una propiedad en el control de usuario y hacer que el usuario controle su propia interfaz de usuario en su método Page_Load.

Algo como esto:

//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

Por favor, intente poner el código en el caso de Page_PreRender página. Funcionará para ti.

+0

El problema con el uso de PreRender para poblar controles es si hay eventos en el control que interactúan con otros controles, los datos se perderán a menos que se rellene durante la carga. Si llena sus controles durante la carga, tendrá acceso a esos datos durante preRender. Cargar -> Eventos Fuego -> PreRender. PreRender debe usarse cuando desee asegurarse de que los datos no estén obsoletos (tal vez cambiados por un evento). –

+0

Tenga en cuenta que Page.PreRender se produce después de la página.Load y los controles en la página activando sus eventos de carga ... antes de la página en realidad. Es la última oportunidad de vincular datos a los controles. –

+0

Esto no funcionó para mí –

1

Tuve este problema cuando estaba agregando un control de usuario en el código por el camino equivocado. Debe usar el método Page.LoadControl para inicializar el control que no puede usar simplemente nuevo.

Cuestiones relacionadas