Строки переменной высоты в WinForms ListView

Возможно ли иметь строки переменной высоты в WinForms ListView в режиме сведений?

Насколько я знаю, в элементе управления нет свойства RowHeight или Rows[i].Height.

Некоторые блоги предлагают реализовать OwnerDraw, что я и сделал, но я все еще не могу найти ничего похожего на свойство height в обработчиках событий.

В идеале высота строки должна автоматически изменяться, чтобы при необходимости отображался многострочный текст.


person dbkk    schedule 09.03.2009    source источник


Ответы (7)


Один вариант для размышления:

Чтобы переопределить высоту элемента всех строк, создайте фиктивный ImageList, установите для него желаемую высоту и назначьте его списку в зависимости от представления или усвойте концепцию http://www.codeproject.com/KB/list/changerowheight.aspx

Если вы используете ObjectListView, вы можете изменить высоту элементов всех строк достаточно легко. Но, тем не менее, нет возможности изменить высоту отдельного элемента, пока вы используете ListView.

person lakshmanaraj    schedule 09.03.2009
comment
Это хорошо как одноразовое решение (если высота уже известна), но я бы хотел, чтобы оно адаптировалось к длинным многострочным ячейкам. - person dbkk; 09.03.2009

Если вы используете режим сведений, мне интересно, не будет ли DataGridView более универсальным. Каждая строка имеет высоту, или вы можете использовать AutoSizeRowsMode, чтобы сделать это автоматически. См. MSDN "Изменение размера столбцов и строк в элементе управления Windows Forms DataGridView" .

person Marc Gravell    schedule 09.03.2009
comment
Я попробовал GridView, но по какой-то причине он намного медленнее (в VirtualMode со многими элементами). - person dbkk; 09.03.2009

ObjectListView, упомянутый в первом ответе, не поддерживает переменную высоту строки. Об этом ясно говорится в его Часто задаваемые вопросы. Базовый элемент управления списком Windows просто не поддерживает переменную высоту строки. Вы должны искать другие, пользовательские письменные элементы управления.

Вы можете рассмотреть отличный XPTable Мэтью Холла и свой проект обновления, а также фантастический список в стиле Outlook.

person Grammarian    schedule 13.05.2009

Элемент управления ListBox поддерживает строки переменной высоты, но вам придется рисовать все самостоятельно.

Установите для DrawMode значение OwnerDrawVariable.

Затем добавьте

protected override void OnDrawItem(DrawItemEventArgs e)
{
  /* Drawing code here */
}

protected override void OnMeasureItem(MeasureItemEventArgs e)
{
  /* Measure code here */
}

Я использую нарисованный владельцем список в программе Task Reporter для перечисления каждой задачи, введенной пользователем. Каждая запись отличается в зависимости от того, сколько текста введено.

person Chris Thompson    schedule 13.03.2009
comment
Если невозможно использовать DataGridView, то это единственный вариант. - person cofiem; 14.03.2009
comment
Это для ListBox, а не для ListView. Другой элемент управления, который не поддерживает MVC/виртуальный режим. - person dbkk; 14.03.2009
comment
Он не уточнил, что ему нужен виртуальный режим, поэтому я просто предложил альтернативный элемент управления, который соответствовал бы потребностям. - person Chris Thompson; 15.03.2009

Если вы согласны со сторонними компонентами, Better ListView поддерживает именно это (каждый элемент имеет CustomHeight свойство, поэтому каждый может иметь разную высоту):

введите здесь описание изображения

person Libor    schedule 22.04.2014

Сам элемент управления Windows ListView (который обернут элементом управления .NET ListView) не поддерживает переменную высоту строк.

Если вы придерживаетесь ListView, вам понадобятся строки с фиксированной высотой.

person Bevan    schedule 11.03.2009

Если вам нужны строки с переменной высотой, я бы вместо этого использовал DataGridView. Он очень поддерживает строки переменной высоты (за счет использования стилей ячеек), и его гораздо проще использовать, чем пытаться втиснуть представление списка в то, что вы хотите.

person Ken Wootton    schedule 13.03.2009