Як я можу встановити для ширини стовпця елемента listview
керування win # winforms значення auto. Щось на зразок ширини = -1 / -2?
Відповіді:
Ви дали відповідь: -2 автоматично зменшить розмір стовпця до довжини тексту в заголовку стовпця, -1 збільшить розмір до найдовшого елемента в стовпці. Все згідно з MSDN . Зверніть увагу, що у випадку -1 вам потрібно буде встановити ширину стовпця після додавання елементів. Отже, якщо ви додаєте новий елемент, вам також потрібно буде призначити властивість width стовпця (або стовпців), який ви хочете автоматично змінити відповідно до даних у 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 dock fill), ви можете використовувати просто метод ...
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, який ви хочете, у параметрі
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;