Как выровнять текст для одного подпункта в ListView с помощью C #? - PullRequest
6 голосов
/ 18 февраля 2009

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

Если да, то как?

Я бы хотел, чтобы текст в одном и том же столбце был выровнен по-разному.

Ответы [ 4 ]

9 голосов
/ 11 мая 2013

пример:

listView1.Columns[1].TextAlign = HorizontalAlignment.Right;

установит выравнивание столбца "1" вправо

9 голосов
/ 18 февраля 2009

Класс "ColumnHeader" имеет свойство "TextAlign", которое изменит выравнивание для всех подэлементов в столбце. Если вам нужно что-то более необычное, вы всегда можете использовать событие DrawSubItem и сделать его владельцем нарисованным.

8 голосов
/ 27 июля 2016

Примечание. Из-за ограничения базового собственного элемента управления ListView (находящегося в comctl32.dll) первый столбец не может быть выровнен. Он всегда будет выровнен по левому краю. Второе ограничение - при пользовательском рисовании (подэлементы пользовательского рисования): при включении переупорядочения столбцов текст первого столбца НЕ переупорядочивается правильно. Я решил это ограничение (не назвал бы это ошибкой, потому что просмотр списка поддерживает много стилей списка, а внутренняя структура данных представления списка - это дерево, похожее на одно), не позволяя переупорядочивать первый столбец, что в большинстве случаев не представляет проблемы. потому что вы будете использовать какой-то ключ для первого столбца, например число или что-то подобное.

5 голосов
/ 19 февраля 2009

Для дальнейшего использования, вот как я решил это:

// Make owner-drawn to be able to give different alignments to single subitems
lvResult.OwnerDraw = true;
...

// Handle DrawSubItem event
private void lvResult_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    // This is the default text alignment
    TextFormatFlags flags = TextFormatFlags.Left;

    // Align text on the right for the subitems after row 11 in the 
    // first column
    if (e.ColumnIndex == 0 && e.Item.Index > 11)
    {
        flags = TextFormatFlags.Right;
    }

    e.DrawText(flags);
}

// Handle DrawColumnHeader event
private void lvResult_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
    // Draw the column header normally
    e.DrawDefault = true;
    e.DrawBackground();
    e.DrawText();
}

Необходимо было обработать DrawColumnHeader, в противном случае текст или разделители столбцов не рисовались бы.

...