C # ListView Ширина стовпця Авто


82

Як я можу встановити для ширини стовпця елемента listviewкерування win # winforms значення auto. Щось на зразок ширини = -1 / -2?

Відповіді:


107

Ви дали відповідь: -2 автоматично зменшить розмір стовпця до довжини тексту в заголовку стовпця, -1 збільшить розмір до найдовшого елемента в стовпці. Все згідно з MSDN . Зверніть увагу, що у випадку -1 вам потрібно буде встановити ширину стовпця після додавання елементів. Отже, якщо ви додаєте новий елемент, вам також потрібно буде призначити властивість width стовпця (або стовпців), який ви хочете автоматично змінити відповідно до даних у ListViewконтролі.


Зауважте, що хоча стаття MSDN посилається на ColumnHeader, це означає лише стовпець. Приклад коду:myListView.Columns[0].Width = -1;
Eric G

103

Використовуй це:

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

від сюди


8
Але що, якщо вам потрібен максимум заголовка або ширина даних? Без мерехтіння?
toddmo

@toddmo Використовуйте обидва рядки. І, якщо потрібно, між listView.BeginUpdate (); ... listView.EndUpdate ();
Артем Ж.

23

Я створив програму, яка кілька разів очищала та поповнювала список. З якоїсь причини, коли я додавав стовпці з шириною = -2, я стикався з проблемою, коли перший стовпець був занадто довгим. Що я зробив, щоб це виправити, це створити цей метод.

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

Чудова річ цього методу в тому, що ви можете помістити його де завгодно, щоб змінити розмір усіх стовпців. Просто передайте свій ListView.


1
це встановить ширину на ширину останнього елемента у вашому ListView
Qsiris

Я використовую ваш код, але якщо у моєму списку є лише одна колонка, кожен раз, коли я отримую горизонтальну смугу прокрутки. Якщо є щонайменше два стовпці, код працює добре. Чи знаєте ви, звідки така поведінка?
prototype0815

2

Якщо у вас є ListView на будь-якій батьківській панелі (ListView dock fill), ви можете використовувати просто метод ...

private void ListViewHeaderWidth() {
        int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
        foreach (ColumnHeader header in listViewInfo.Columns)
        {
            header.Width = HeaderWidth;
        }
    }

2

Існує ще один корисний метод, AutoResizeColumnякий дозволяє автоматично встановити розмір певного стовпця з необхідним параметром.

Ви можете назвати це так:

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

1

Розширивши трохи відповідь Фредріка, якщо ви хочете встановити ширину автоматичного зміни розміру стовпця на льоту, наприклад: встановлення ширини автоматичного розміру першого стовпця до 70:

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

1

Це рішення спочатку змінить розмір стовпців на основі даних стовпців; якщо змінена ширина менше розміру заголовка, розмір стовпців зменшиться принаймні до заголовка. Це досить потворне рішення, але воно працює.

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 - це ListView. colFirstName - це стовпець, де 60 - це ширина, необхідна для розміщення заголовка. І т.д.


0

Ви можете використовувати щось на зразок цього, передаючи ListView, який ви хочете, у параметрі

    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();
    }

0

Також варто зазначити, що ListView може не відображатись належним чином без попередньої зміни властивості:

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

Для мене Visual Studio здається за промовчанням для View.LargeIcon з якихось причин, тому нічого не відображається, доки його не змінимо.

Повний код, щоб відобразити один стовпець у ListView та забезпечити місце для вертикальної смуги прокрутки.

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);
}

-1

Я вважаю, що автор шукав еквівалентний метод через IDE, який би генерував код позаду та переконався, що всі параметри на місці тощо. Знайшов це від MS:

Створення обробників подій у конструкторі Windows Forms

Виходячи з фону VB, це те, що я шукав, ось коротка версія для несприятливого натискання:

  1. Клацніть на форму або елемент керування, для якого потрібно створити обробник подій.
  2. У вікні Властивості натисніть кнопку Події
  3. У списку доступних подій клацніть подію, для якої потрібно створити обробник подій.
  4. У полі праворуч від назви події введіть ім'я обробника та натисніть ENTER
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.