Comment définir la largeur de colonne d'un contrôle c # winforms listview
sur auto. Quelque chose comme largeur = -1/-2?
Vous avez donné la réponse: -2 réduira automatiquement la taille de la colonne à la longueur du texte figurant dans l'en-tête de la colonne, -1 réduira automatiquement la taille de l'élément le plus long de la colonne. Tous selon MSDN . Notez cependant que dans le cas de -1, vous devrez définir la largeur de la colonne après avoir ajouté le ou les éléments. Ainsi, si vous ajoutez un nouvel élément, vous devrez également affecter la propriété width de la colonne (ou des colonnes) que vous souhaitez redimensionner automatiquement en fonction des données dans le contrôle ListView
.
Utilisez ceci:
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
de ici
J'ai créé un programme qui effaçait et remplissait ma liste de vues plusieurs fois. Pour une raison quelconque, chaque fois que j’ajoutais des colonnes de largeur = -2, je rencontrais un problème de longueur de la première colonne. Ce que j'ai fait pour résoudre ce problème a été de créer cette méthode.
private void ResizeListViewColumns(ListView lv)
{
foreach(ColumnHeader column in lv.Columns)
{
column.Width = -2;
}
}
L'avantage de cette méthode est que vous pouvez pratiquement le placer n'importe où pour redimensionner toutes vos colonnes. Il suffit de passer votre ListView
.
Cette solution redimensionnera d'abord les colonnes en fonction des données de colonne. Si la largeur redimensionnée est inférieure à la taille de l'en-tête, elle redimensionnera les colonnes au moins pour les adapter à l'en-tête. C'est une solution assez laide, mais cela fonctionne.
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 est le ListView . colFirstName est une colonne, où 60 est la largeur requise pour tenir le titre . Etc.
Si vous avez ListView dans n'importe quel panneau parent (ListView dock fill), vous pouvez utiliser simplement la méthode ...
private void ListViewHeaderWidth() {
int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
foreach (ColumnHeader header in listViewInfo.Columns)
{
header.Width = HeaderWidth;
}
}
Si vous voulez définir la largeur de redimensionnement automatique de la colonne à la volée, développez un peu la réponse de Fredrik. Par exemple, définissez la largeur de la taille automatique de la première colonne sur 70:
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
Vous pouvez utiliser quelque chose comme ceci, en passant le ListView que vous voulez dans 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();
}
Il existe une autre méthode utile appelée AutoResizeColumn
qui vous permet de dimensionner automatiquement une colonne spécifique avec le paramètre requis.
Comme ça:
listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
Il est également intéressant de noter que ListView peut ne pas s'afficher comme prévu sans d'abord modifier la propriété:
myListView.View = View.Details; // or View.List
Pour moi, Visual Studio semble attribuer la valeur par défaut à View.LargeIcon, de sorte que rien ne s'affiche jusqu'à ce qu'il soit modifié.
Code complet pour afficher une seule colonne dans un ListView et laisser de la place pour une barre de défilement verticale.
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);
}