it-swarm.com.ru

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

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

69
Kai

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

95
Fredrik Mörk

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

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

от здесь

83
Majid

Я сделал программу, которая очищала и обновляла мой просмотр списка несколько раз. По какой-то причине всякий раз, когда я добавлял столбцы с шириной = -2, я сталкивался с проблемой слишком длинного первого столбца. То, что я сделал, чтобы исправить это, было создать этот метод.

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

Самое замечательное в этом методе заключается в том, что вы можете поместить его куда угодно, чтобы изменить размер всех ваших столбцов. Просто введите ваш ListView.

22
Jimmy Campbell

Это решение сначала изменяет размер столбцов на основе данных столбцов. Если ширина с измененным размером меньше размера заголовка, он изменяет размер столбцов, чтобы по крайней мере соответствовать заголовку. Это довольно уродливое решение, но оно работает.

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 - ширина, необходимая для соответствия заголовку . И т.д.

1
Niclas Lindstedt

Если у вас есть ListView на любой родительской панели (заполнение дока ListView), вы можете просто использовать метод ...

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

Немного расширив ответ Фредрика, если вы хотите на лету установить ширину автоматического изменения размера столбца Например: установка ширины автоматического размера первого столбца равной 70:

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

Вы можете использовать что-то вроде этого, передавая 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();
    }
1
Nickyboy

Существует еще один полезный метод с именем AutoResizeColumn, который позволяет автоматически изменять размер определенного столбца с требуемым параметром.

Как это:

listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
0
David Silva-Barrera

Также стоит отметить, что 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);
}
0
tonyb