.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