Как я могу установить ширину столбца элемента listview
управления winforms c # на auto. Что-то вроде width = -1 / -2?
Ответы:
Вы дали ответ: -2 автоматически изменит размер столбца до длины текста в заголовке столбца, -1 автоматически изменит размер до самого длинного элемента в столбце. Все согласно MSDN . Обратите внимание, что в случае -1 вам нужно будет установить ширину столбца после добавления элемента (ов). Поэтому, если вы добавляете новый элемент, вам также необходимо назначить свойство ширины столбца (или столбцов), размер которого вы хотите ListView
автоматически изменить в соответствии с данными в элементе управления.
Использовать этот:
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
yourListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
от сюда
Я сделал программу, которая очищала и заполняла мой список несколько раз. По какой-то причине всякий раз, когда я добавлял столбцы с шириной = -2, я сталкивался с проблемой, когда первый столбец был слишком длинным. Чтобы исправить это, я создал этот метод.
private void ResizeListViewColumns(ListView lv)
{
foreach(ColumnHeader column in lv.Columns)
{
column.Width = -2;
}
}
Самое замечательное в этом методе то, что вы можете поместить его где угодно, чтобы изменить размер всех ваших столбцов. Просто передайте свой ListView
.
Если у вас есть ListView на любой родительской панели (заполнение док-станции ListView), вы можете использовать простой метод ...
private void ListViewHeaderWidth() {
int HeaderWidth = (listViewInfo.Parent.Width - 2) / listViewInfo.Columns.Count;
foreach (ColumnHeader header in listViewInfo.Columns)
{
header.Width = HeaderWidth;
}
}
Существует еще один полезный метод, AutoResizeColumn
который позволяет автоматически изменять размер определенного столбца с помощью требуемого параметра.
Вы можете назвать это так:
listview1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
listview1.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize);
listview1.AutoResizeColumn(4, ColumnHeaderAutoResizeStyle.HeaderSize);
Немного расширив ответ Фредрика, если вы хотите установить ширину автоматического изменения размера столбца на лету, например: установка ширины автоматического изменения размера первого столбца на 70:
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.None);
myListView.Columns[0].Width = 70;
myListView.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
Это решение сначала изменит размер столбцов на основе данных столбца. Если измененная ширина меньше размера заголовка, оно изменит размер столбцов, по крайней мере, так, чтобы соответствовать заголовку. Это довольно неприятное решение, но оно работает.
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 - ширина, необходимая для размещения заголовка. И т.п.
Вы можете использовать что-то вроде этого, передав нужный 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();
}
Также стоит отметить, что 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);
}
Я считаю, что автор искал эквивалентный метод через IDE, который генерировал бы код и проверял, что все параметры на месте, и т.д. Нашел это из MS:
Создание обработчиков событий в конструкторе Windows Forms
Исходя из фона VB, это то, что я искал, вот краткая версия для неблагоприятных кликов:
- Щелкните форму или элемент управления, для которого вы хотите создать обработчик событий.
- В окне "Свойства" нажмите кнопку "События".
- В списке доступных событий щелкните событие, для которого вы хотите создать обработчик событий.
- В поле справа от имени события введите имя обработчика и нажмите ENTER.
myListView.Columns[0].Width = -1;