C # ListView Ancho de columna automático

82

¿Cómo puedo configurar el ancho de columna del listviewcontrol ac # winforms en automático? ¿Algo como ancho = -1 / -2?

Kai
fuente

Respuestas:

106

Usted dio la respuesta: -2 ajustará automáticamente la columna a la longitud del texto en el encabezado de la columna, -1 se ajustará automáticamente al elemento más largo de la columna. Todo según MSDN . Sin embargo, tenga en cuenta que en el caso de -1, deberá establecer el ancho de la columna después de agregar los elementos. Entonces, si agrega un nuevo elemento, también deberá asignar la propiedad de ancho de la columna (o columnas) que desea ajustar automáticamente de acuerdo con los datos en ListViewcontrol.

Fredrik Mörk
fuente
Tenga en cuenta que, si bien el artículo de MSDN hace referencia a ColumnHeader, eso solo se refiere a la columna. Ejemplo de código:myListView.Columns[0].Width = -1;
Eric G
103

Utilizar esta:

yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

desde aqui

Majid
fuente
8
Pero, ¿qué pasa si desea el máximo del encabezado o el ancho de los datos? ¿Sin parpadeo?
Toddmo
@toddmo Usa ambas cadenas. Y, si es necesario, entre listView.BeginUpdate (); ... listView.EndUpdate ();
Artem Zh.
23

Hice un programa que borró y rellenó mi vista de lista varias veces. Por alguna razón, cada vez que agregué columnas con ancho = -2, encontré un problema con la primera columna demasiado larga. Lo que hice para solucionar esto fue crear este método.

private void ResizeListViewColumns(ListView lv)
{
    foreach(ColumnHeader column in lv.Columns)
    {
        column.Width = -2;
    }
}

Lo mejor de este método es que puedes colocarlo en cualquier lugar para cambiar el tamaño de todas tus columnas. Simplemente pase su ListView.

Jimmy Campbell
fuente
1
esto establecerá el ancho al ancho del último elemento en su ListView
Qsiris
Utilizo su código, pero si solo tengo una columna en mi vista de lista, cada vez obtengo una barra de desplazamiento horizontal. Si hay al menos dos columnas, el código funciona bien. ¿Sabes de dónde viene este comportamiento?
prototype0815
2

Existe otro método útil llamado AutoResizeColumnque le permite ajustar automáticamente el tamaño de una columna específica con el parámetro requerido.

Puedes llamarlo así:

listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
David Silva-Barrera
fuente
1

Ampliando un poco la respuesta de Fredrik, si desea establecer el ancho de cambio de tamaño automático de la columna sobre la marcha, por ejemplo: estableciendo el ancho de tamaño automático de la primera columna en 70:

myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
Joe
fuente
1

Esta solución primero cambiará el tamaño de las columnas según los datos de la columna, si el ancho redimensionado es menor que el tamaño del encabezado, cambiará el tamaño de las columnas para que al menos se ajusten al encabezado. Esta es una solución bastante fea, pero funciona.

lstContacts.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
colFirstName.Width = (colFirstName.Width < 60 ? 60 : colFirstName.Width);
colLastName.Width = (colLastName.Width < 61 ? 61 : colLastName.Width);
colPhoneNumber.Width = (colPhoneNumber.Width < 81 ? 81 : colPhoneNumber.Width);
colEmail.Width = (colEmail.Width < 40 ? 40 : colEmail.Width);

lstContacts es ListView. colFirstName es una columna, donde 60 es el ancho necesario para ajustarse al título. Etc.

Niclas Lindstedt
fuente
1

Si tiene ListView en cualquier panel principal (relleno de muelle de ListView), puede usar el método simple ...

private void ListViewHeaderWidth() {
        int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
        foreach (ColumnHeader header in listViewInfo.Columns)
        {
            header.Width = HeaderWidth;
        }
    }
Tomáš Krása
fuente
0

Puede usar algo como esto, pasando el ListView que desea en param

    private void AutoSizeColumnList(ListView listView)
    {
        //Prevents flickering
        listView.BeginUpdate();

        Dictionary<int, int> columnSize = new Dictionary<int,int>();

        //Auto size using header
        listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

        //Grab column size based on header
        foreach(ColumnHeader colHeader in listView.Columns )
            columnSize.Add(colHeader.Index, colHeader.Width);

        //Auto size using data
        listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);

        //Grab comumn size based on data and set max width
        foreach (ColumnHeader colHeader in listView.Columns)
        {
            int nColWidth;
            if (columnSize.TryGetValue(colHeader.Index, out nColWidth))
                colHeader.Width = Math.Max(nColWidth, colHeader.Width);
            else
                //Default to 50
                colHeader.Width = Math.Max(50, colHeader.Width);
        }

        listView.EndUpdate();
    }
Nickyboy
fuente
0

También vale la pena señalar que es posible que ListView no se muestre como se esperaba sin antes cambiar la propiedad:

myListView.View = View.Details; // or View.List

Para mí, Visual Studio parece establecerlo de forma predeterminada en View.LargeIcon por alguna razón, por lo que no aparece nada hasta que se cambia.

Complete el código para mostrar una sola columna en un ListView y deje espacio para una barra de desplazamiento vertical.

lisSerials.Items.Clear();
lisSerials.View = View.Details;
lisSerials.FullRowSelect = true;

// add column if not already present
if(lisSerials.Columns.Count==0)
{
    int vw = SystemInformation.VerticalScrollBarWidth;
    lisSerials.Columns.Add("Serial Numbers", lisSerials.Width-vw-5);
}

foreach (string s in stringArray)
{
    ListViewItem lvi = new ListViewItem(new string[] { s });
    lisSerials.Items.Add(lvi);
}
Tonyb
fuente
-1

Creo que el autor estaba buscando un método equivalente a través del IDE que generaría el código subyacente y se aseguraría de que todos los parámetros estuvieran en su lugar, etc. Encontré esto en MS:

Creación de controladores de eventos en el diseñador de formularios de Windows

Viniendo de un fondo de VB, esto es lo que estaba buscando, aquí está la versión breve para el clic adverso:

  1. Haga clic en el formulario o control para el que desea crear un controlador de eventos.
  2. En la ventana Propiedades, haga clic en el botón Eventos
  3. En la lista de eventos disponibles, haga clic en el evento para el que desea crear un controlador de eventos.
  4. En el cuadro a la derecha del nombre del evento, escriba el nombre del controlador y presione ENTER
Jason
fuente