Как я могу установить ширину столбца элемента listview
управления winforms c # на auto. Что-то вроде width = -1 / -2?
82
Вы дали ответ: -2 автоматически изменит размер столбца до длины текста в заголовке столбца, -1 автоматически изменит размер до самого длинного элемента в столбце. Все согласно MSDN . Обратите внимание, что в случае -1 вам нужно будет установить ширину столбца после добавления элемента (ов). Поэтому, если вы добавляете новый элемент, вам также необходимо назначить свойство ширины столбца (или столбцов), размер которого вы хотите ListView
автоматически изменить в соответствии с данными в элементе управления.
myListView.Columns[0].Width = -1;
Использовать этот:
от сюда
источник
Я сделал программу, которая очищала и заполняла мой список несколько раз. По какой-то причине всякий раз, когда я добавлял столбцы с шириной = -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, это то, что я искал, вот краткая версия для неблагоприятных кликов:
источник