C # ListView Spaltenbreite Auto

81

Wie kann ich die Spaltenbreite des ac # winforms- listviewSteuerelements auf auto setzen ? So etwas wie width = -1 / -2?

Kai
quelle

Antworten:

104

Sie haben die Antwort gegeben: -2 passt die Spalte automatisch an die Länge des Textes in der Spaltenüberschrift an, -1 automatisch an das längste Element in der Spalte. Alles laut MSDN . Beachten Sie jedoch, dass Sie im Fall von -1 die Spaltenbreite nach dem Hinzufügen der Elemente festlegen müssen. Wenn Sie also ein neues Element hinzufügen, müssen Sie auch die width-Eigenschaft der Spalte (oder Spalten) zuweisen, deren Größe Sie gemäß den ListViewkontrollierten Daten ändern möchten .

Fredrik Mörk
quelle
Beachten Sie, dass der MSDN-Artikel zwar auf ColumnHeader verweist, dies jedoch nur die Spalte bedeutet. Codebeispiel:myListView.Columns[0].Width = -1;
Eric G
103

Benutze das:

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

von hier

Majid
quelle
8
Was aber, wenn Sie das Maximum des Headers oder der Datenbreite wünschen? Ohne Flimmern?
Toddmo
@toddmo Verwenden Sie beide Zeichenfolgen. Und, falls erforderlich, zwischen listView.BeginUpdate (); ... listView.EndUpdate ();
Artem Zh.
23

Ich habe ein Programm erstellt, das meine Listenansicht mehrmals gelöscht und wieder aufgefüllt hat. Aus irgendeinem Grund trat beim Hinzufügen von Spalten mit der Breite = -2 ein Problem auf, bei dem 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 sie so ziemlich überall platzieren können, um die Größe aller Ihrer Spalten zu ändern. Geben Sie einfach Ihre ListView.

Jimmy Campbell
quelle
1
Dadurch wird die Breite auf die Breite des letzten Elements in Ihrer ListView
Qsiris
Ich verwende Ihren Code, aber wenn ich nur eine Spalte in meiner Listenansicht habe, erhalte ich jedes Mal eine horizontale Bildlaufleiste. Wenn mindestens zwei Spalten vorhanden sind, funktioniert der Code gut. Wissen Sie, woher dieses Verhalten kommt?
Prototyp
2

Es gibt eine weitere nützliche Methode, mit AutoResizeColumnder Sie die Größe einer bestimmten Spalte mit dem erforderlichen Parameter automatisch anpassen können.

Sie können es so nennen:

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

Erweitern Sie die Antwort von Fredrik ein wenig, wenn Sie beispielsweise die automatische Größenänderung der Spalte im laufenden Betrieb festlegen möchten: Setzen Sie die automatische Größenbreite der ersten Spalte auf 70:

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

Bei dieser Lösung wird zunächst die Größe der Spalten basierend auf den Spaltendaten geändert. Wenn die Größe der Größe kleiner als die Kopfzeilengröße ist, wird die Größe der Spalten so geändert, dass sie mindestens in die Kopfzeile passen. Dies ist eine ziemlich hässliche Lösung, aber sie 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 zum Anpassen des Titels erforderlich ist. Etc.

Niclas Lindstedt
quelle
1

Wenn Sie ListView in einem übergeordneten Bereich haben (ListView-Dockfüllung), können Sie einfach die Methode ...

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

Sie können so etwas verwenden und 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();
    }
Nickyboy
quelle
0

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

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

Für mich scheint Visual Studio aus irgendeinem Grund standardmäßig View.LargeIcon zu verwenden, 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 zu schaffen.

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
quelle
-1

Ich glaube, der Autor hat über die IDE nach einer äquivalenten Methode gesucht, die den Code dahinter generiert und sicherstellt, dass alle Parameter vorhanden sind usw. Gefunden von MS:

Erstellen von Ereignishandlern im Windows Forms Designer

Da ich selbst aus einem VB-Hintergrund stamme, war dies das, wonach ich gesucht habe. Hier ist die Kurzversion für den Klick-Nachteil:

  1. Klicken Sie auf das Formular oder Steuerelement, für das Sie einen Ereignishandler erstellen möchten.
  2. Klicken Sie im Eigenschaftenfenster auf die Schaltfläche Ereignisse
  3. Klicken Sie in der Liste der verfügbaren Ereignisse auf das Ereignis, für das Sie einen Ereignishandler erstellen möchten.
  4. Geben Sie in das Feld rechts neben dem Ereignisnamen den Namen des Handlers ein und drücken Sie die EINGABETASTE
Jason
quelle