web-dev-qa-db-fra.com

Largeur de colonne C # ListView Auto

Comment définir la largeur de colonne d'un contrôle c # winforms listview sur auto. Quelque chose comme largeur = -1/-2?

69
Kai

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.

95
Fredrik Mörk

Utilisez ceci:

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

de ici

83
Majid

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.

22
Jimmy Campbell

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.

1
Niclas Lindstedt

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;
        }
    }
1
Tomáš Krása

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);
1
Joe

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();
    }
1
Nickyboy

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);
0
David Silva-Barrera

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);
}
0
tonyb