2011-03-30 77 views

Respuesta

46

tratar de implementar esta manera, va a trabajar 100%

panel.HorizontalScroll.Maximum = 0; 
panel.AutoScroll = false; 
panel.VerticalScroll.Visible = false; 
panel.AutoScroll = true; 
+9

Esta debería ser la respuesta aceptada. Ninguno de los otros funcionó para mí, sin embargo, este código simple en realidad lo solucionó! –

+0

@AnonymousPi Probé mucho para solucionar este problema. Un desperdicio de día para que realmente lo arregle tan simple. –

+0

Esta es una respuesta impresionante y simple para deshacerse de la barra de desplazamiento horizontal. Incluí esta solución (con crédito para @Kbv Subrahmanyam!) En una solución más general para los problemas de desplazamiento automático que estaba teniendo aquí ... http://stackoverflow.com/a/35065017/2175233 –

13

Creo que está teniendo este problema porque la propiedad AutoScroll de su panel está establecida en verdadero. Hice una solución de ensayo (.NET 3.5) y descubrió lo siguiente:

Si intenta esto:

panel.AutoScroll = true; 
panel.HorizontalScroll.Enabled = false; 
panel.HorizontalScroll.Visible = false; 

la HorizontalScroll.Enabled y .Visible no son cambiado a false (suponiendo que el panel tiene controles dentro de eso, causa desplazamiento automático para mostrar la barra de desplazamiento horizontal). Parece que debe deshabilitar AutoScroll para poder cambiar estas propiedades de forma manual.

+0

Visual Studio establece que el panel tampoco tienen HScrollProperties, ¿está seguro de que no lo tiene? –

+0

Bla, perdón, prueba HScroll = falso; –

+0

tampoco lo tengo, estoy tratando de eliminarlo de un panel, no un formulario, –

20

Si usted se siente como profanar su código podría intentar esta solución muy "hacker":

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow); 

private enum ScrollBarDirection 
{ 
    SB_HORZ = 0, 
    SB_VERT = 1, 
    SB_CTL = 2, 
    SB_BOTH = 3 
} 

protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    ShowScrollBar(panel1.Handle, (int)ScrollBarDirection.SB_BOTH, false); 
    base.WndProc(ref m); 
} 

Actualmente estoy usando el código anterior para evitar que una tercera parte de control de usuario mostrando sus barras de desplazamiento. No estaban exponiendo ninguna forma adecuada de ocultarlos.

+0

Bueno, no creo que se haya usado, hice una pequeña prueba y la usé, y un panel simplemente desapareció y el otro aún tenía las barras de desplazamiento. gracias anayway :) –

+5

¡Funciona muy bien! Aunque la parte 'WndProc' definitivamente no es necesaria. Simplemente llame al: 'ShowScrollBar (panel1.Handle, (int) ScrollBarDirection.SB_HORZ, false);' ¡De otro método cada vez que quiera ocultar esa barra de desplazamiento! – BrainSlugs83

+0

¡Está mostrando un error en el servidor de win 2008 al cerrar el formulario! –

0

Gestionado código C++ para ocultar HScroll Bar:

// Hide horizontal scroll bar 
HWND h = static_cast<HWND> (this->Handle.ToPointer()); 
ShowScrollBar(h, SB_HORZ, false); 
5

que estaba teniendo este mismo tipo de problema con el desplazamiento horizontal que aparece cuando el desplazamiento automático = cierto, sólo aparecía cuando apareció la barra de desplazamiento vertical. Finalmente me di cuenta de que había eliminado el relleno del panel y al agregar 20 al relleno derecho permitía que apareciera la barra de desplazamiento vertical y no la horizontal.

+0

Tengo un TableLayoutPanel desplazable acoplado para llenar su contenedor principal, y simplemente agregando 20px relleno derecho al TableLayoutPanel trabajado (la barra de desplazamiento horizontal ya no aparece). – Rachel

0

Otra solución, que parecía ser la única que pude conseguir trabajo era el lugar hacky:

 foreach (UserControl control in ListPanel.Controls) 
     { 
      if (ListPanel.VerticalScroll.Visible) 
       control.Width = ListPanel.Width - 23; 
      else 
       control.Width = ListPanel.Width-5; 
     } 

Qué me llamar en su evento OnResize

0

Estaba buscando una respuesta a la pregunta de cómo agregar una barra de desplazamiento a un cuadro cuando sea necesario y eliminarlo cuando no sea necesario. Esta es la solución que se me ocurrió para un cuadro de texto, con el ancho y alto máximos permitidos, redimensionado para el texto que se muestra.

private void txtOutput_TextChanged(object sender, EventArgs e) 
    { 
     // Set the scrollbars to none. If the content fits within textbox maximum size no scrollbars are needed. 
     txtOutput.ScrollBars = ScrollBars.None; 

     // Calculate the width and height the text will need to fit inside the box 
     Size size = TextRenderer.MeasureText(txtOutput.Text, txtOutput.Font); 

     // Size the box accordingly (adding a bit of extra margin cause i like it that way) 
     txtOutput.Width = size.Width + 20; 
     txtOutput.Height = size.Height + 30; 


     // If the box would need to be larger than maximum size we need scrollbars 

     // If height needed exceeds maximum add vertical scrollbar 
     if (size.Height > txtOutput.MaximumSize.Height) 
     { 

      txtOutput.ScrollBars = ScrollBars.Vertical; 

      // If it also exceeds maximum width add both scrollbars 
      // (You can't add vertical first and then horizontal if you wan't both. You would end up with just the horizontal) 
      if (size.Width > txtOutput.MaximumSize.Width) 
      { 
       txtOutput.ScrollBars = ScrollBars.Both; 
      } 
     } 

     // If width needed exceeds maximum add horosontal scrollbar 
     else if (size.Width > txtOutput.MaximumSize.Width) 
     { 
      txtOutput.ScrollBars = ScrollBars.Horizontal; 
     } 
    } 
0

¡La respuesta de SuperOli fue genial!

Actualicé el código por lo que es posible cerrar el formulario sin ningún error.
Espero que funcione para usted también.

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow); 

private enum ScrollBarDirection 
{ 
    SB_HORZ = 0, 
    SB_VERT = 1, 
    SB_CTL = 2, 
    SB_BOTH = 3 
} 

protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    if (m.Msg == 0x85) // WM_NCPAINT 
    {     
     ShowScrollBar(panel1.Handle, (int)ScrollBarDirection.SB_BOTH, false); 
    } 

    base.WndProc(ref m); 
} 
Cuestiones relacionadas