c# - visual - vb barras de desplazamiento
Cómo deshabilitar la barra de desplazamiento horizontal para el panel de tabla en winforms (7)
Hola, tengo un tablelayoutpanel y estoy enlazando los controles dinámicamente. Cuando el recuento de elementos supera la altura del panel que obviamente aparece la barra de desplazamiento vertical, no hay problema.
Pero al mismo tiempo que aparece la barra de desplazamiento horizontal, incluso el ancho de los elementos es menor que el ancho del panel. ¿Cómo puedo prevenir esto?
¿El problema es que sus elementos tienen exactamente el ancho del panel de diseño, de modo que cuando aparece el desplazamiento de artículo, se corta un poco en sus controles, forzando el desplazamiento horizontal? Si es así, puede hacer que sus controles sean más pequeños a lo ancho para tener en cuenta la posibilidad de la barra de desplazamiento, o puede intentar ajustarlos cuando aparezca la barra de desplazamiento.
Esto funcionó perfectamente en .NET 3.5, donde las otras soluciones no me dieron exactamente lo que quería:
if (this.TableLayoutPanel1.HorizontalScroll.Visible)
{
int newWid = this.TableLayoutPanel1.Width -
(2 * SystemInformation.VerticalScrollBarWidth);
//this.TableLayoutPanel1.Padding = new Padding(0, 0, newWid, 0);
foreach (Control ctl in this.TableLayoutPanel1.Controls)
{
ctl.Width = newWid;
}
}
He experimentado este problema.
Mucha gente también tiene el mismo problema en Datagrid. Pero, no hay una solución exacta para esta pregunta, tendrá que decidir manualmente la dimensión del panel según su uso.
tableLayoutPanel1.HorizontalScroll.Enabled = false;
esto deshabilitará la barra de desplazamiento horizontal, pero tendrá que ajustar manualmente la dimensión del panel de diseño de la tabla.
Otra forma podría ser calcular el ancho posible de tablelayoutpanel durante el tiempo de ejecución y si es mayor que el valor que ha establecido, puede habilitarlo.
tableLayoutPanel1.HorizontalScroll.Enabled = true;
Perdí algunos pelos en esto hoy, pero lo resolví y esto es con lo que terminé:
Cree una nueva clase que herede de TableLayoutPanel (llamémosla MyTableLayoutPanel), y anule la propiedad MaximumSize como esta:
public override Size MaximumSize { get { if (Parent != null) return new Size(Parent.Width, 0); else return base.MaximumSize; } set { base.MaximumSize = value; } }
Por supuesto, podría hacerlo con un propósito más general si agrega otra propiedad que decida si debe devolver o no el tamaño máximo modificado o no, pero espero que sea obvio para cualquiera que esté leyendo esto.
Cambie el TableLayoutPanel que tiene al nuevo tipo MyTableLayoutPanel.
Añádalo a un Panel regular. Habilite AutoScroll en este panel en lugar de MyTableLayoutPanel (deshabilítelo allí si aún no lo ha hecho).
Establezca la propiedad MyTableLayoutPanel AutoSize en true y su propiedad Anchor en Left, Right y Top.
Resolví esto utilizando un Panel simple en el que acoplé el panel de tableoutout. Entonces hice que el TLP no tuviera las barras de desplazamiento, sino el Panel. Esto funciona bien para mi.
Asumo que el TLP con las diferentes columnas y filas tiene problemas para calcular el ancho de cada una y, por lo tanto, muestra una barra de desplazamiento vertical incluso cuando no es necesario.
Tuve este problema con un TableLayoutPanel acoplado que contenía GroupBoxes acoplados y una única Columna configurada a 100% de ancho. No quería establecer un tamaño manual para estos, quería cambiar el tamaño junto con el formulario.
Por extraño que parezca, el ajuste del relleno derecho de TableLayoutPanel en 1 (no el ancho de la barra de desplazamiento, que dejaba un espacio del tamaño de la barra de desplazamiento, como era de esperar) resolvió el problema por completo. Esto está en C # 2010 Express, .NET 4, Windows 8. No tengo idea si este kludge funciona en otras variaciones.
Establecer el relleno en 0 parecía resolver el problema en el IDE, pero el problema todavía existía cuando se ejecutaba realmente.
Me huele a algún tipo de error en el TableLayoutPanel ... o tal vez es solo la combinación particular de controles y propiedades que tengo (es un diseño bastante complicado).
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;
tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0);