¿Cómo puedo configurar el ancho de columna del listview
control ac # winforms en automático? ¿Algo como ancho = -1 / -2?
Respuestas:
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 ListView
control.
Utilizar esta:
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
desde aqui
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
.
Existe otro método útil llamado AutoResizeColumn
que 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);
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);
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.
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;
}
}
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();
}
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);
}
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:
- Haga clic en el formulario o control para el que desea crear un controlador de eventos.
- En la ventana Propiedades, haga clic en el botón Eventos
- En la lista de eventos disponibles, haga clic en el evento para el que desea crear un controlador de eventos.
- En el cuadro a la derecha del nombre del evento, escriba el nombre del controlador y presione ENTER
myListView.Columns[0].Width = -1;