Я нигде не смог найти ответ на эту, казалось бы, простую тему: можно ли выровнять текст одного подэлемента в элементе управления WinForms ListView?
Если да, то как?
Я хотел бы, чтобы текст в одном и том же столбце был выровнен по-разному.
Я нигде не смог найти ответ на эту, казалось бы, простую тему: можно ли выровнять текст одного подэлемента в элементе управления WinForms ListView?
Если да, то как?
Я хотел бы, чтобы текст в одном и том же столбце был выровнен по-разному.
пример :
listView1.Columns[1].TextAlign = HorizontalAlignment.Right;
установит выравнивание столбца "1" вправо
Примечание. Из-за ограничения базового встроенного элемента управления ListView (находящегося в comctl32.dll) первый столбец нельзя выровнять. Он всегда будет выровнен по левому краю. Второе ограничение — когда вы настраиваете рисование (настраиваемые подэлементы рисования): когда вы включаете переупорядочивание столбцов, текст первого столбца НЕ переупорядочивается правильно. Я решил это ограничение (не назвал бы это ошибкой, потому что представление списка поддерживает множество стилей списка, а внутренняя структура данных представления списка похожа на дерево), не позволяя изменять порядок первого столбца, что в большинстве случаев не проблема. , потому что вы будете использовать какой-то ключ для первого столбца, например число или что-то подобное.
mask
значение LVCF_FMT
и заполните элемент fmt
. Затем отправьте сообщение LVM_SETCOLUMN
элементу управления.
- person Cody Gray; 27.03.2021
Класс «ColumnHeader» имеет свойство «TextAlign», которое изменяет выравнивание для всех подэлементов в столбце. Если вам нужно что-то более причудливое, вы всегда можете использовать событие "DrawSubItem" и сделать его владельцем.
Для дальнейшего использования, вот как я это решил:
// 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, иначе не рисовались бы ни текст, ни разделители столбцов.
Поместите элемент управления 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.
Основываясь на ответе @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 );
}