2010-03-26 15 views
5

En mi página tengo n-userControls (mismo control) Necesito comunicarme entre ellos (para ser más específico, necesito pasar uno en valor).Compartir datos entre controles de usuario

No quiero involucrar a la página de alojamiento para eso.

Los controles actúan como "localizadores" e interactúan con los datos paginados en la página de host mediante eventos a los que está suscrita la página de alojamiento.
Así que cuando el usuario hace clic en uno de los buscapersonas y cambia su estado, el otro control debe saberlo y cambiarse en consecuencia.

No puedo usar VieState porque viewstate es por control y también lo es el controlstate.

¿Puedo usar Session para eso? (la sesión es compartida y solo hay un valor que necesito almacenar)

¿O tal vez hay algo mejor que puedo usar? (no QueryString)

Respuesta

1

Personalmente no hay una manera "fácil" de hacer esto sin hacerlo a través de la página de control, o un evento.

Por lo que dices lo que yo imaginaba sería algo como esto. Suponiendo dos controles A y B que son los controles de buscapersonas.

La página contenedora se suscribe al evento "PageSelectionChanged" en ambos controles, en respuesta a ese evento actualiza los datos, que ya tiene, Y enumera a través de todos los controles del buscapersonas el valor "Página actual".

Ya tiene la instalación de plomería para eventos para la comunicación desde el control -> página, use lo que ya ha construido.

¿Por qué no sesión?

Me preguntaron en los comentarios si esto sería mejor que la sesión, y la respuesta es sí, por una serie de razones.

  1. Información de la sesión, a no ser limpiado explícitamente existe para la duración de una sesión de usuarios (normalmente 20 minutos)
  2. Becase del número 1, que tendría que añadir elementos a la página, ya que si (! IsPostBack) para "borrar" las variables de la sesión para que el usuario no inicie en una página diferente.
  3. El futuro crecimiento de la aplicación, la información de la sesión tiene que ser movida fuera del proceso a SQL Server o de otra manera a trabajar en un entorno de granja de servidores web, para esto trato de evitarlo también.
  4. El uso de la sesión almacena esta información en la memoria en el servidor web, aunque es pequeña (4 bytes si es un número entero) puede sumarse y no es necesaria
  5. Dependiendo de la naturaleza de sus actualizaciones, no puede garantizar el orden de control solo con la sesión para garantizar que 1 control fuerce una actualización de todos los controles.

Existen otras soluciones, la solución similar a la publicada anteriormente que hace una mirada recursiva a la página, pero hay que tener cuidado con eso para asegurarse de no entrar en una situación de recursividad sin fin Además, si tiene muchos controles en la página, puede agregar una gran cantidad de sobrecarga para recorrer todo constantemente.

+0

sí, esto quiere trabajar, pero esto requiere más código que tengo que añadir en la página de alojamiento (en este momento, junto al caso de suscribirse la página de alojamiento no interactúa con los controles) se requre colocar a través de los controles y encontrándolos en la página. ¿Es mejor entonces guardar una sesión de números enteros para que ambos controles puedan leerla? – toraan

+0

Sí, ver mi actualización a esta publicación en cuanto a por qué (Fue demasiado largo para un comentario) –

+0

tan bucle para controles de usuario en la página de alojamiento (necesito encontrar todos los controles de usuario en mi página) ¿es la mejor opción en mi escenario? – toraan

0

La página del contenedor tiene una propiedad en viewstate que almacena el estado.Cuando un usuario hace clic en uno de los buscapersonas, se genera un evento manejado por la página del contenedor. Esto luego recorre los n controles de usuario y llama a un método público en esos controles.

0

Puede crear una versión modificada rápida del Patrón de observador. Sugeriría construir un control de pesebre en las páginas. Pero si no quiere modificar la página, aquí hay una solución rápida.

Puede crear un método estático que notifique todo el mismo tipo de controles. Llamando a su método de actualización. Siéntete libre de pasar los datos que necesites.

protected void control_event(object sender, EventArgs e) 
{ 
    UpdateAllControls(page); 
} 


public static void UpdateAllControls(Control parent /* can be Page */) 
     { 
      foreach (Control c in parent.Controls) 
      { 
       if (c.GetType() == this.GetType()) 
        ((MyType)).Update() 
       if (c.HasControls()) 
        controls = GetAllControls(controls, t, c); 
      } 
     } 
+0

Esta solución funcionaría, sin embargo, advertiría contra la recursión, si no fuera necesario. si tiene muchos controles, este puede ser un proceso costoso. Si los controles del usuario siempre se agregan a la página, omita la parte de recursión del proceso. –

+0

Esto es asumiendo que no tiene conocimiento de cómo está configurada la página. Y sí, estoy de acuerdo, es un método lento. Registrar cada control con un observador sería la mejor solución. – Glennular

+0

¿Cómo el código anterior es diferente del observador? – toraan

Cuestiones relacionadas