7 de septiembre de 2017

Redimensionar automáticamente las columnas del ListView

Artículo original: Automatically Sizing ListView Columns
http://doughennig.blogspot.com/2007/01/automatically-sizing-listview-columns.html
Autor: Doug Hennig
Traducido por: Ana María Bisbé York


Utilizo el control ActiveX Microsoft ListView hace un tiempo. Brinda varios beneficios sobre los grid de sólo lectura, incluyendo múltiple selección de filas y fácil soporte para imágenes. Usualmente, yo trato de evadir el tener una barra horizontal si es posible, entonces yo dimensiono el ListView y sus columnas y los datos caben muy bien.

Sin embargo, se desordena cuando aparece la barra de movimiento vertical, lo que ocurre automáticamente cuando hay más filas que las que el ListView puede mostrar. En este caso, si ha definido el tamaño de sus columnas, de tal modo que quepan exactamente en el ancho del ListView, tendrá una barra de desplazamiento horizontal porque la barra de desplazamiento vertical ocupa algo del ancho del ListView, que ya fue utilizado por las columnas.

Para solucionar esto, he decidido que era mejor iniciar el tamaño de las columnas un poco mayor que lo necesario para mostrar sus datos (si es posible), entonces estrecharlas si la barra de desplazamiento vertical aparece. El único problema: ¿cómo saber cuando la barra de desplazamiento vertical es visible? No hay ninguna propiedad que lo indique, entonces decidí calcularlo por el método de la fuerza bruta.

El siguiente código asume que el control ListView se llama oList y tiene dos columnas, la segunda de ellas se redimensiona después de cargar la lista. Hay un par de números mágicos aquí, el 1 es la altura de la línea de la cuadrícula en el ListView y el 22 es la altura de los encabezados de columnas. El código determina si aparece una barra de desplazamiento vertical al calcular la altura de cada elemento (la altura de la fuente más la línea de la cuadrícula), al multiplicar por el número de filas, y agregar la altura de los encabezados de columnas. Si esto es mayor que la altura del ListView, hay una barra de desplazamiento vertical, entonces, se ajusta el ancho de las columnas, teniendo en cuenta el ancho del ListView, el ancho de la primera columna, el ancho del borde del ListView y el ancho de la barra de desplazamiento vertical.

with This.oList
llScroll = .ListItems.Count * ;
  (fontmetric(1, .Object.Font.Name, .Object.Font.Size) + ;
  fontmetric(5, .Object.Font.Name, .Object.Font.Size) + 1) + ;
  22 > .Height
.ColumnHeaders.Item(2).Width = .Width - ; .ColumnHeaders.Item(1).Width - sysmetric(4) - ; iif(llScroll, sysmetric(7), 0) endwith

Ajuste este código tanto como sea necesario, si tiene más de dos columnas, o desea redimensionar una columna diferente, o más de una columna.


No hay comentarios. :

Publicar un comentario

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.