Jak ustawić szerokość kolumny listview
kontrolki ac # winforms na auto. Coś jak szerokość = -1 / -2?
Odpowiedzi:
Podałeś odpowiedź: -2 automatycznie dostosuje rozmiar kolumny do długości tekstu w nagłówku kolumny, -1 spowoduje automatyczne dopasowanie rozmiaru do najdłuższego elementu w kolumnie. Wszystko zgodnie z MSDN . Zauważ jednak, że w przypadku -1 będziesz musiał ustawić szerokość kolumny po dodaniu elementu (ów). Jeśli więc dodasz nowy element, będziesz musiał również przypisać właściwość szerokości kolumny (lub kolumn), które chcesz automatycznie zmieniać zgodnie z ListView
kontrolowanymi danymi .
Użyj tego:
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
od tutaj
Zrobiłem program, który wielokrotnie czyścił i uzupełniał mój widok listy. Z jakiegoś powodu za każdym razem, gdy dodawałem kolumny o szerokości = -2, napotkałem problem z pierwszą kolumną, która była zbyt długa. Aby to naprawić, stworzyłem tę metodę.
private void ResizeListViewColumns(ListView lv)
{
foreach(ColumnHeader column in lv.Columns)
{
column.Width = -2;
}
}
Wspaniałą rzeczą w tej metodzie jest to, że możesz ją umieścić w dowolnym miejscu, aby zmienić rozmiar wszystkich kolumn. Po prostu podaj swój ListView
.
Jeśli masz ListView w dowolnym panelu nadrzędnym (wypełnienie dokowania ListView), możesz użyć prostej metody ...
private void ListViewHeaderWidth() {
int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
foreach (ColumnHeader header in listViewInfo.Columns)
{
header.Width = HeaderWidth;
}
}
Jest jeszcze jedna przydatna metoda, AutoResizeColumn
która umożliwia automatyczne dopasowanie rozmiaru określonej kolumny z wymaganym parametrem.
Możesz to nazwać tak:
listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
Rozwijając nieco odpowiedź Fredrika, jeśli chcesz ustawić szerokość automatycznej zmiany rozmiaru kolumny w locie, na przykład: ustawienie szerokości automatycznego rozmiaru pierwszej kolumny na 70:
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
To rozwiązanie najpierw zmieni rozmiar kolumn na podstawie danych kolumny, jeśli zmieniona szerokość jest mniejsza niż rozmiar nagłówka, zmieni rozmiar kolumn, aby przynajmniej pasowały do nagłówka. To dość brzydkie rozwiązanie, ale działa.
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 to ListView. colFirstName to kolumna, gdzie 60 to szerokość wymagana do dopasowania tytułu. Itp.
Możesz użyć czegoś takiego, przekazując ListView, który chcesz w 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();
}
Warto również zauważyć, że ListView może nie wyświetlać się zgodnie z oczekiwaniami bez uprzedniej zmiany właściwości:
myListView.View = View.Details; // or View.List
Wydaje mi się, że Visual Studio z jakiegoś powodu domyślnie ustawia go na View.LargeIcon, więc nic się nie pojawia, dopóki nie zostanie zmienione.
Uzupełnij kod, aby wyświetlić pojedynczą kolumnę w ListView i zwolnić miejsce na pionowy pasek przewijania.
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);
}
Uważam, że autor szukał równoważnej metody za pośrednictwem IDE, która wygenerowałaby kod i upewniła się, że wszystkie parametry są na miejscu, itp. Znalazłem to z MS:
Tworzenie programów obsługi zdarzeń w Projektancie formularzy systemu Windows
Wychodząc z tła VB, właśnie tego szukałem, oto krótka wersja niekorzystnego kliknięcia:
- Kliknij formularz lub kontrolkę, dla której chcesz utworzyć procedurę obsługi zdarzeń.
- W oknie Właściwości kliknij przycisk Zdarzenia
- Na liście dostępnych zdarzeń kliknij zdarzenie, dla którego chcesz utworzyć procedurę obsługi zdarzeń.
- W polu po prawej stronie nazwy zdarzenia wpisz nazwę programu obsługi i naciśnij klawisz ENTER
myListView.Columns[0].Width = -1;