Wie kann ich die Spaltenbreite des ac # winforms- listview
Steuerelements auf auto setzen ? So etwas wie width = -1 / -2?
Antworten:
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 ListView
kontrollierten Daten ändern möchten .
Benutze das:
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
von hier
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
.
Es gibt eine weitere nützliche Methode, mit AutoResizeColumn
der 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);
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);
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.
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;
}
}
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();
}
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);
}
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:
- Klicken Sie auf das Formular oder Steuerelement, für das Sie einen Ereignishandler erstellen möchten.
- Klicken Sie im Eigenschaftenfenster auf die Schaltfläche Ereignisse
- Klicken Sie in der Liste der verfügbaren Ereignisse auf das Ereignis, für das Sie einen Ereignishandler erstellen möchten.
- Geben Sie in das Feld rechts neben dem Ereignisnamen den Namen des Handlers ein und drücken Sie die EINGABETASTE
myListView.Columns[0].Width = -1;