2010-01-14 13 views
5

He creado un control de usuario con la siguiente propiedad pública:¿Cómo se actualiza la interfaz UserControl en tiempo de diseño en función del valor de la propiedad?

[Browsable(true)] 
public string Text 
{ 
    get { return pnlLookupTable.GroupingText; } 
    set { pnlLookupTable.GroupingText = value; } 
} 

pnlLookupTable es, como se puede suponer, un panel de control. Puedo cambiar el valor de la propiedad Texto en la ventana Propiedades y se refleja en el marcado como debería ser. Sin embargo, la vista de diseño del UserControl dentro de una página no muestra GroupingText actualizado para el Panel. ¿Cómo puedo lograr que esto suceda?

EDITAR:

Por petición, aquí está toda la clase a la que pertenece esa propiedad. Se puede ver que no hay nada especial pasando:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class LookupTable : System.Web.UI.UserControl 
{ 
    [Browsable(true)] 
    public string Text 
    { 
     get { return pnlLookupTable.GroupingText; } 
     set { pnlLookupTable.GroupingText = value; } 
    } 
} 

y aquí está la parte correspondiente del archivo .ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="LookupTable.ascx.cs" Inherits="LookupTable" %> 
<asp:Panel ID="pnlLookupTable" runat="server" GroupingText="Lookup Table"> 
    <%-- Irrelevant content here. --%> 
</asp:Panel> 

He cambiado algunos identificadores y otras cosas triviales para proteger la naturaleza propietaria de la código.

También debería reiterar que estoy buscando un formulario web en modo de diseño que tiene mi control agregado, y estoy cambiando la propiedad de texto. Quiero ver visualmente el cambio al GroupingText del Panel en el diseñador.

+0

¿Cómo implementó su control de usuario? Como un archivo ASCX con código en él? ¿O escribiste una clase personalizada derivada de UserControl? Por favor, muestre un poco más de código de su escenario ya que eso puede afectar la respuesta. – Eilon

+0

Eilon, he actualizado mi publicación. No hay mucho más para ver. :) –

+0

Un seguimiento rápido: creo que es hora de que acepte que esto no se puede hacer y seguir adelante. Ya que es solo una cuestión de conveniencia, no garantiza la creación de un control personalizado ni la compilación de .ascx, aunque esas son buenas sugerencias. Gracias por las contribuciones de todos. Definitivamente aprendí algunas cosas. –

Respuesta

6

tendría que pensar un poco atrás al código UserControlDesigner ...

En pocas palabras: no creo que es posible.

y aquí está la larga historia:

De lo que recuerdo, controles de usuario ubicados en archivos ASCX no se ejecutan en el diseñador. Es decir, el código dentro del archivo ASCX o ASCX.CS nunca se compila o se ejecuta en Visual Studio. Esto es para evitar pérdidas de memoria causadas por el hecho de que en el CLR no puede descargar los ensamblados que ha cargado. Para ejecutar el código en su Control de usuario, Visual Studio tendría que compilar su ASCX en una DLL, luego cargarlo y luego ejecutar el código. Cada vez que realice un cambio en el ASCX, tendrá que realizar esta operación nuevamente. Cada vez que ocurre esta operación, la DLL adicional cargada consumirá más memoria generada desde su ASCX.

Debido a esta limitación en el CLR, el diseñador de Control de usuario no compila ni ejecuta el archivo ASCX. En cambio, analiza el archivo ASCX y busca controles dentro de él y carga esos controles en su lugar. Para cada control que encuentre en el archivo ASCX, creará el diseñador de control asociado y representará el tiempo de diseño HTML del control.

Hay un par de maneras de evitar esto:

  1. lugar de utilizar un control de usuario ASCX puede escribir un control personalizado regular que se deriva de Control y el código se escribe en un archivo de VB CS o .
  2. Compila el ASCX en una DLL. David Ebbo escribió un blog post sobre cómo hacer esto.

La razón por la que estas dos soluciones deberían funcionar es porque ambas implican tener el código compilado en una DLL. La idea es que el archivo DLL no cambia con mucha frecuencia, por lo que es seguro que Visual Studio cargue el archivo DLL sin riesgo de tener que volver a cargarlo cada vez que cambie el archivo DLL (y pierda memoria).

+0

Gracias por la información, Eilon. Me pregunto si la solución en esa publicación de blog se aplica a VS 2008 o si algo ha cambiado. De todos modos, me da un buen punto de partida para investigar un poco más. –

+0

Este comportamiento es el mismo en VS2005, VS2008 y VS2010. No sé de ningún plan para cambiar este comportamiento. – Eilon

+0

Estaba leyendo acerca de por qué no puedes descargar montajes y es muy interesante. Esto tiene más sentido ahora. –

1

Estaba seguro de que tenía una respuesta para esto, y lo escribí todo, pero algo me estaba molestando, así que terminé probando esto durante unas horas.

Resulta que (como dijo Eilon), no creo que puedas hacer esto.

Los controles ASCX ignoran por completo DesignerAttribute, por lo que no puede especificar un procesador de tiempo de diseño personalizado para ellos. Pensé "bien, puedo subclasificar el control Panel y especificar un nuevo diseñador que obtendrá propiedades del control padre". ¿Adivina qué? Ninguna posibilidad. Si accede al control principal del Panel en el diseñador, , no se lanzará al tipo de control de usuario personalizado. Puedo ver que es un UserControl, y no puede ser ningún otro UserControl, excepto mi TestUserControl, ¡pero la clase de diseño arroja una excepción si intento lanzarlo!

Esto me hace pensar que soy honesto. Básicamente, es exactamente lo que dice Eilon: existe una restricción intencional en los controles de usuario de la web en el modo de diseño.

Here's a vague post from Steven Cheng suggesting that design time support is just a no-go for web usercontrols.

Si bien esta fue una oportunidad para mí el aprendizaje sea divertido, lo siento informar que no creo que una Ascx se corte. Estoy bastante seguro de que incluso compilarlo en una DLL como Eilon sugirió ni siquiera lo hará. Probablemente tendrá que ir a la ruta de control personalizado.

+0

Gracias por su esfuerzo, womp. Esto también me ayudará a cavar un poco más profundo. Acepto que esto puede ser imposible, pero como tu soy curioso y me gusta saber por qué. –

Cuestiones relacionadas