Как выровнять текст для одного подэлемента в ListView с помощью С#?

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

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

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


person Fueled    schedule 18.02.2009    source источник


Ответы (6)


пример :

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

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

person Novpiar Effendi    schedule 11.05.2013

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

person Martin.Martinsson    schedule 27.07.2016
comment
Это верно лишь отчасти. На самом деле собственный элемент управления ListView просто игнорирует спецификацию выравнивания столбца при создании первого столбца. Если вы последуете за созданием этого первого столбца, явно указав выравнивание, то это выравнивание будет соблюдено. Создайте структуру LVCOLUMN, задайте для элемента mask значение LVCF_FMT и заполните элемент fmt. Затем отправьте сообщение LVM_SETCOLUMN элементу управления. - person Cody Gray; 27.03.2021

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

person David    schedule 18.02.2009
comment
Да, мне нужно что-то более причудливое, и это то, что я пытался подразумевать под одним подэлементом и текстом в одном и том же столбце, выровненным по-разному. Я посмотрю на событие DrawSubItem. - person Fueled; 19.02.2009
comment
Я не могу сделать ваш ответ принятым, потому что я чувствую, что мой вопрос не был прочитан должным образом, и вы не предоставили никаких образцов кода. Но, поскольку это указало мне правильное направление, я проголосовал за вас. Спасибо! - person Fueled; 19.02.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, иначе не рисовались бы ни текст, ни разделители столбцов.

person Fueled    schedule 19.02.2009

Поместите элемент управления ListView в форму и назовите его «listV1», добавьте и отредактируйте 4 столбца. Также определите один Index. Затем отформатируйте столбец «0» без заголовка и с шириной = 0. Таким образом, столбец 0 будет невидим. Затем вы можете отформатировать другие столбцы по своему усмотрению (левый, центральный, правый), которые все видны.

ListView listV1 = new ListView();
uint Index = 0;   
string[] Split_Message = Some_Message.Split(','); // split it to comma...
ListViewItem L = new ListViewItem(""); //... to column "0" assign empty string...
L.SubItems.Add(Index.ToString() + "."); //... than fill the first fild in the row. It is number converted to string...
L.SubItems.Add(Split_Message[0]); //... then first string from buffer...
L.SubItems.Add(Split_Message[1]); //... again, second string from buffer etc. ...
listV1.Items.Add(L); //... and at the end write all of this into the first row.
Indexx++; // Next number.
person Pecilije Velicanstveni    schedule 29.03.2020

Основываясь на ответе @Fueled, вот что я сделал, чтобы использовать выравнивание заголовков столбцов:

    protected override void OnDrawSubItem( DrawListViewSubItemEventArgs e )
        {
        // Match the subitem alignment to the column header alignment
        TextFormatFlags flags = TextFormatFlags.Left;
        switch ( this.Columns[ e.ColumnIndex ].TextAlign )
            {
            case HorizontalAlignment.Right:
                flags = TextFormatFlags.Right;
                break;
            case HorizontalAlignment.Center:
                flags = TextFormatFlags.HorizontalCenter;
                break;
            }
        e.DrawText( flags );
        }
person Glenn    schedule 02.06.2020