.NET ListView, максимальное количество символов или максимальная ширина столбца? Можно переопределить/расширить?

У меня есть элемент управления .NET ListView, в котором я отображаю трассировку стека. Я использовал ListView, так как мне нужно было управлять шрифтом/цветом определенных строк.

Однако кажется, что существует какой-то максимум в отношении ширины столбцов, либо количества отображаемых символов, либо количества пикселей, которое может быть в столбце.

Вот простой пример LINQPad, показывающий проблему:

void Main()
{
    using (var fm = new Form())
    {
        ListView lv = new ListView();
        fm.Controls.Add(lv);
        lv.Dock = DockStyle.Fill;
        lv.View = View.Details;
        lv.Columns.Add("C", -1, HorizontalAlignment.Left);

        string line = new string('W', 258) + "x";
        lv.Items.Add(line);
        line = new string('W', 259) + "x";
        lv.Items.Add(line);

        lv.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent);
        lv.Columns[0].Width.Dump();

        fm.ShowDialog();
    }
}

Снимок экрана:

скриншот проблемы со списком

Как видите, строка, содержащая 258 букв W + X, показывает x, тогда как следующая строка, содержащая одну дополнительную W, не показывает x.

Результат вычисления ширины показывает, что текущая ширина столбца составляет 2864 пикселя.

Вопрос в следующем: можно ли что-нибудь настроить в ListView, чтобы обойти это ограничение?


person Lasse V. Karlsen    schedule 05.04.2011    source источник
comment
Обратите внимание, что мне также нужно иметь возможность выбирать отдельные строки, поэтому какой-то вариант управления rtf или HTML не годится. Однако, если другой элемент управления может делать то же самое, т. е. элементы на основе списка, элементы управления шрифтом/цветом, тогда я весь в ушах.   -  person Lasse V. Karlsen    schedule 06.04.2011


Ответы (1)


Это поведение задокументировано на страницах MSDN для ListViewItem:

Текст ListViewItem не должен превышать 259 символов, иначе может произойти непредвиденное поведение.

По словам сотрудника Microsoft:

Почему длина текста элемента списка ограничена 259 символами, потому что список предназначен для отображения набора объектов, таких как файлы, а не для общего управления. Таким образом, это похоже на ограничение длины имени файла в MAX_PATH файловой системы Windows.

Об этом также есть статья службы поддержки Microsoft. ListViewItem хранит полный текст, это просто отображение, которое ограничено по длине.


Однако представляется возможным отобразить полный текст, если вы создадите собственный ListView и установите для него значение OwnerDraw:

public class MyListView : ListView
{
    public MyListView()
    {
        OwnerDraw = true;
        DrawItem += new DrawListViewItemEventHandler(MyListView_DrawItem);
    }

    private void MyListView_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
        e.Graphics.DrawString(e.Item.Text, e.Item.Font, 
                                    new SolidBrush(e.Item.ForeColor), e.Bounds);
    }
}

Это отображает полный текст каждого ListViewItem. Недостатком этого является то, что вам также нужно будет настраивать другие визуальные состояния (например, выбранное состояние, состояние фокуса и т. д.), если только вы не можете каким-то образом направить их в исходный код рисования.

Я понятия не имею, есть ли какие-либо другие побочные эффекты от этого.

person adrianbanks    schedule 05.04.2011
comment
Это не работает, весь текст перепутан, и вы не можете щелкнуть каждый элемент ListViewItem. - person Omzig; 05.09.2017