wake-up-neo.net

C # ListView Spaltenbreite Auto

Wie kann ich die Spaltenbreite eines c # winforms listview-Steuerelements auf auto setzen? Etwas wie width = -1/-2?

69
Kai

Sie haben die Antwort gegeben: -2 wird die Spalte automatisch an die Länge des Textes in der Spaltenüberschrift anpassen, -1 wird an das längste Element in der Spalte angepasst. Alles nach MSDN . Beachten Sie jedoch, dass Sie im Fall von -1 die Spaltenbreite einstellen müssen, nachdem Sie die Elemente hinzugefügt haben. Wenn Sie also ein neues Element hinzufügen, müssen Sie auch die width -Eigenschaft der Spalte (oder der Spalten) zuweisen, die Sie anhand der Daten im ListView-Steuerelement automatisch skalieren möchten.

95
Fredrik Mörk

Benutze das:

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

von hier

83
Majid

Ich habe ein Programm erstellt, mit dem meine Listenansicht mehrmals gelöscht und wieder aufgefüllt wurde. Beim Hinzufügen von Spalten mit width = -2 ist aus irgendeinem Grund ein Problem aufgetreten, wobei die erste Spalte viel zu lang war. Um dies zu beheben, habe ich diese Methode erstellt.

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

Das Tolle an dieser Methode ist, dass Sie die Größe Ihrer Spalten beliebig ändern können. Geben Sie einfach Ihre ListView ein.

22
Jimmy Campbell

Bei dieser Lösung wird die Größe der Spalten zunächst auf der Grundlage der Spaltendaten geändert. Wenn die Breite der Größe kleiner als die Kopfgröße ist, wird die Größe der Spalten mindestens auf die Kopfzeile angepasst. Dies ist eine ziemlich hässliche Lösung, aber es funktioniert.

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 ist die ListView . colFirstName ist eine Spalte, wobei 60 die Breite ist, die für den Titel . usw. erforderlich ist.

1

Wenn Sie ListView in einem übergeordneten Panel haben (ListView Dock Fill), können Sie einfach Methode ...

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

Fredriks Antwort wird etwas erweitert, wenn Sie die Breite der Spalte für die automatische Größenänderung der Spalte schnell einstellen wollen.

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

Sie können so etwas verwenden, indem Sie die gewünschte ListView in param übergeben

    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

Es gibt eine weitere nützliche Methode namens AutoResizeColumn, mit der Sie eine bestimmte Spalte mit dem erforderlichen Parameter automatisch skalieren können.

So was:

listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
0

Es ist auch erwähnenswert, dass ListView möglicherweise nicht wie erwartet angezeigt wird, ohne zuerst die Eigenschaft zu ändern:

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

Für mich scheint Visual Studio aus irgendeinem Grund standardmäßig auf View.LargeIcon gesetzt zu sein, sodass nichts angezeigt wird, bis es geändert wird.

Vervollständigen Sie den Code, um eine einzelne Spalte in einer ListView anzuzeigen und Platz für eine vertikale Bildlaufleiste zuzulassen.

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