.NET ListView, максимальное количество символов или максимальная ширина столбца? Возможно переопределить / расширить? - PullRequest
5 голосов
/ 06 апреля 2011

У меня есть элемент управления .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();
    }
}

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

screenshot of listview problem

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

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

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

1 Ответ

8 голосов
/ 06 апреля 2011

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

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

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

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

Существует также статья поддержки 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.Недостаток в этом заключается в том, что вам также нужно будет настраивать другие визуальные состояния (например, выбранное состояние, состояние фокуса и т. Д.), Если вы не можете каким-либо образом перенаправить их в исходный код для рисования.

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

...