2011-01-12 22 views
12

Tengo un formulario de múltiples formas, en el panel izquierdo hay un árbol y en el panel derecho hay un Panel. Las selecciones de árbol dan como resultado que UserControls específicos se carguen en el Panel. En este caso, dado que el formulario padre siempre está cargado, no puedo enganchar en el evento Mostrado del formulario principal.Cómo llamar a un método en un UserControl después de que se muestra?

La mayoría de mis CU tienen un DataGridView desatado sobre ellos que necesita ser rellenado cuando se crea el UC. Puede haber 50,000 filas agregadas en el frente a veces, desde una base de datos de SQL Server.

Hasta ahora he llenado las cuadrículas durante el constructor de UC, pero desde que comenzamos a trabajar con 50,000 filas, las cosas han cambiado. He descubierto que llenar la grilla con 50,000 filas del constructor toma al menos 15 minutos por alguna razón loca. Sin embargo, si espero llenar la cuadrícula hasta que haga clic en un botón o desde el evento Cargar, demora 15 segundos. Esto es un misterio. Así que estoy tratando de mover la carga de la grilla a otra parte.

Cuando intento llenar la cuadrícula del evento Load, sin embargo, hay inconsistencias visuales. Lo que ocurre es que aparece una versión pequeña de mi CU, tarda 15 segundos en cargar las filas DGV y, a continuación, la UC se expande para llenar el Panel (la propiedad del Dock UC está configurada como Rellenar). Entonces tampoco me gusta esta opción.

El evento Mostrado sería un lugar perfecto para cargar mi grilla, si existía para UC. ¿Alguien sabe de otra manera de hacer esto?

+1

Una mejor pregunta es ¿por qué se tarda 15 minutos en cargar en el constructor, pero 15 segundos en otro lugar. – Justin

+1

Probablemente porque la lógica de su población se está ejecutando sobre la base de algo que cambia muchas veces durante la construcción de la forma, o está cargando caché cargando varios DGV en carga de formularios. – KeithS

+0

Las ideas son bienvenidas sobre por qué esto está sucediendo. Prefiero quedarme con mi enfoque anterior. El código consiste en una llamada a la base de datos (los datos no cambian) y llenar un único DGV. Hay una diferencia entre llamar desde el constructor y llamar desde el botón: se está llamando al constructor desde dentro de una cadena de BackgroundWorker. ¿Podría ser esa la causa? –

Respuesta

16

Mi respuesta a un problema similar fue llenar el DGV cuando la cuadrícula se hizo visible por primera vez. Esta es la esencia de la carga lenta; obtener la información en el último segundo posible.

Enganche en VisibleChanged, que se activará cuando su control haya llamado a Show() u Hide(), o bien a la propiedad Visible configurada manualmente. Si el campo está actualmente visible, Y el control no se está cerrando o se está desechando (debido a que por algún motivo extraño los controles pueden volverse visibles en este caso), realice su población de grillas.

Aquí está el controlador necesario, muy simple:

protected override void OnVisibleChanged(EventArgs e) 
{ 
    base.OnVisibleChanged(e); 

    if (Visible && !Disposing) PopulateGridView(); //<-- your population logic 
} 
+0

Gracias, estoy seguro de que esto funcionaría para una UC de tamaño estático, sin embargo, cuando lo pruebo con mi UC que tiene "Full" en su contenedor, la cuadrícula se llena antes de que la UC cambie de tamaño para adaptarse al contenedor, lo que da como resultado -barras de desplazamiento en el medio del aire durante los 15 segundos que lleva cargar la grilla. Sin embargo, encontré una forma de cargar la grilla, llamando a un método después de que se cargó la UC (¡necesitaba usar ugh DoEvents para que dibujara primero!). –

+0

Está cerca de lo que quiero, pero ahora este tiempo de carga tiene lugar fuera de BackgroundWorker y la GUI se vuelve menos sensible (potencial (No responde) que odio). Sin embargo, esta puede ser mi mejor solución. –

+0

Huh. Mis UCs ​​con gridviews también están llenos. Intente usar SuspendLayout y ResumeLayout para pausar el posicionamiento del elemento de la ventana hasta que la población esté completa.Para resolver el problema de no respuesta, puede configurar su control de usuario con un delegado y controlador de eventos que interactuará con una rutina de populación asincrónica. Haga que UC inicie un método BeginPopulate, suscríbase a un evento PopulateComplete y realice su trabajo de llenado de cuadrícula desde ese controlador. – KeithS

Cuestiones relacionadas