tutorial form c# winforms

c# - form - ¿Cómo deshabilito la barra de desplazamiento horizontal en un Panel?



form c# (8)

Tengo un panel (Windows Forms) y deseo deshabilitar una barra de desplazamiento horizontal de los paneles. Intenté esto:

HorizontalScroll.Enabled = false;

Pero eso no funcionaría.

¿Cómo puedo hacer esto?


Código de C ++ administrado para ocultar la barra de HScroll:

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


Creo que tienes este problema porque la propiedad AutoScroll de tu panel está configurada como verdadera. Hice una solución de prueba (.NET 3.5) y descubrí lo siguiente:

Si intentas esto:

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

HorizontalScroll.Enabled y .Visible no se cambian a falso (suponiendo que el panel tenga controles dentro de esa causa, el desplazamiento automático muestra la barra de desplazamiento horizontal). Parece que debes desactivar AutoScroll para poder cambiar estas propiedades manualmente.


Estaba buscando una respuesta a la pregunta sobre 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 la altura máxima permitidos, redimensionados 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; } }


Intenta implementarlo de esta manera, funcionará al 100%.

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


La respuesta de SuperOli fue genial!

Actualicé el código para que sea posible cerrar el formulario sin ningún error.
Espero que te funcione 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); }


Otra solución, que parecía ser la única en la que podía trabajar era la más bien intrépida:

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

A lo que yo llamo en su evento OnResize.


Si tienes ganas de profanar tu código, puedes probar esta solución tan "hackish":

[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 un UserControl de terceros muestre sus barras de desplazamiento. No estaban exponiendo ninguna forma apropiada de esconderlos.


Tenía este mismo tipo de problema con el desplazamiento horizontal que aparecía cuando AutoScroll = true, solo aparecía cuando aparecía la barra de desplazamiento vertical. Finalmente me di cuenta de que quité el relleno del panel y al agregar 20 al relleno derecho, esto permitió que la barra de desplazamiento vertical apareciera y no mostrara la horizontal.