2012-02-16 13 views
14

Esto es para un formulario de Windows.C# Panel con desplazamiento automático - Restablecimiento de la posición de Srollbar en un foco de control

Panel tiene AutoScroll = True

Estoy añadiendo paneles dinámicamente al panel principal que terminan superior a la principal rectángulo de visualización de panel. Luego agregue etiquetas, cuadros combinados y cuadros de texto a los paneles agregados.

Si selecciono un cuadro combinado o cuadro de texto, restablece la posición de la barra de desplazamiento de los paneles principales a 0 y también el menú desplegable de un cuadro combinado se colocará en la pantalla X, Y donde debería estar si la barra de desplazamiento no restablecer

Estoy pensando en guardar la posición de desplazamiento cuando se selecciona un control. Después de la prueba, parece que la posición de desplazamiento no se ha restablecido todavía, así que puedo capturarla aquí. Luego, espero restaurar la posición de desplazamiento en algún evento del panel. Estoy tratando de averiguar exactamente qué evento usaría para restablecer la posición de desplazamiento. También espero que el menú desplegable se coloque en la x, y correcta cuando hago esto.

Una mejor solución sería crear un control personalizado basado en el control del panel y anular un evento posiblemente? De esta forma no necesitaría ocupar mi proyecto con guardar la posición de desplazamiento cada vez que utilizo un panel de desplazamiento.

+0

Parece que si selecciono el control una vez que saltará a la parte superior, entonces si selecciono ese mismo control nuevamente después de desplazarme hacia abajo nuevamente, la posición de la barra de desplazamiento no se restablecerá. – Untouchable

Respuesta

29

he encontrado la respuesta al problema que estaba teniendo aquí: Answer

public class CustomPanel : System.Windows.Forms.Panel 
{ 
    protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl) 
    { 
     // Returning the current location prevents the panel from 
     // scrolling to the active control when the panel loses and regains focus 
     return this.DisplayRectangle.Location; 
    } 
} 
+4

Para las generaciones futuras (y si el enlace se rompe): 1. Panel de subclase 2. anule ScrollToControl() para devolver this.DisplayRectangle.Location – Asaf

+0

Para los débiles: _Subclassing_ no implica más de: Pegue el código anterior en su _Form.cs_ y cambie los dos puntos en _Form.Designer.cs_ de '..System.Panel' a' CustomPanel'. – TaW

+0

Al usar una TabPage en lugar de un Panel, el procedimiento es exactamente el mismo, pero debe restar 3 píxeles de los valores X e Y de DisplayRectangle.Location para el borde de TabControl. –

0

Gracias, esto funciona muy bien, excepto que tuve que ajustar para el relleno del panel en la parte inferior. Solo un FYI para cualquier otra persona que pueda estar viendo algunas compensaciones.

protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl) 
{ 
    Point retPt = DisplayRectangle.Location; 
    retPt.Offset(new Point(-1*Padding.Left, -1*Padding.Bottom)); 

    return retPt; 
} 
Cuestiones relacionadas