C # ListView Column Width Auto

82

Jak ustawić szerokość kolumny listviewkontrolki ac # winforms na auto. Coś jak szerokość = -1 / -2?

Kai
źródło

Odpowiedzi:

106

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 ListViewkontrolowanymi danymi .

Fredrik Mörk
źródło
Należy zauważyć, że chociaż artykuł MSDN odwołuje się do ColumnHeader, oznacza to tylko kolumnę. Przykład kodu:myListView.Columns[0].Width = -1;
Eric G
103

Użyj tego:

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

od tutaj

Majid
źródło
8
Ale co, jeśli chcesz mieć maksimum nagłówka lub szerokość danych? Bez migotania?
toddmo
@toddmo Użyj obu ciągów. W razie potrzeby między listView.BeginUpdate (); ... listView.EndUpdate ();
Artem Zh.
23

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.

Jimmy Campbell
źródło
1
spowoduje to ustawienie szerokości na szerokość ostatniego elementu w Twoim ListView
Qsiris,
Używam twojego kodu, ale jeśli mam tylko jedną kolumnę w moim widoku listy, za każdym razem pojawia się poziomy pasek przewijania. Jeśli są co najmniej dwie kolumny, kod działa dobrze. Czy wiesz, skąd się bierze takie zachowanie?
prototyp
2

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;
        }
    }
Tomáš Krása
źródło
2

Jest jeszcze jedna przydatna metoda, AutoResizeColumnktó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);
David Silva-Barrera
źródło
1

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);
Joe
źródło
1

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.

Niclas Lindstedt
źródło
0

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();
    }
Nickyboy
źródło
0

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);
}
tonyb
źródło
-1

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:

  1. Kliknij formularz lub kontrolkę, dla której chcesz utworzyć procedurę obsługi zdarzeń.
  2. W oknie Właściwości kliknij przycisk Zdarzenia
  3. Na liście dostępnych zdarzeń kliknij zdarzenie, dla którego chcesz utworzyć procedurę obsługi zdarzeń.
  4. W polu po prawej stronie nazwy zdarzenia wpisz nazwę programu obsługi i naciśnij klawisz ENTER
Jason
źródło