Ширина столбца C # ListView Авто


82

Как я могу установить ширину столбца элемента listviewуправления winforms c # на auto. Что-то вроде width = -1 / -2?

Ответы:


107

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


Обратите внимание: хотя статья MSDN ссылается на ColumnHeader, это означает только столбец. Пример кода:myListView.Columns[0].Width = -1;
Eric G

103

Использовать этот:

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

от сюда


8
Но что, если вам нужен максимум заголовка или ширины данных? Без мерцания?
toddmo 03

@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), вы можете использовать простой метод ...

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

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.