我无法在任何地方找到关于这个看似简单的主题的答案:是否可以在 WinForms ListView 控件中对齐单个子项的文本?
如果是这样,怎么做?
我想让同一列中的文本以不同的方式对齐。
我无法在任何地方找到关于这个看似简单的主题的答案:是否可以在 WinForms ListView 控件中对齐单个子项的文本?
如果是这样,怎么做?
我想让同一列中的文本以不同的方式对齐。
例子 :
listView1.Columns[1].TextAlign = HorizontalAlignment.Right;
将列的“1”对齐设置为右
注意:由于底层原生 ListView 控件(位于 comctl32.dll 中)的限制,第一列无法对齐。它总是左对齐。第二个限制是当您自定义绘制(自定义绘制子项)时:当您启用列重新排序时,第一列的文本未正确重新排序。我通过不允许对第一列重新排序解决了这个限制(不会称其为错误,因为列表视图支持许多列表样式并且列表视图的内部数据结构是树状的),这在大多数情况下是没有问题的,因为您将对第一列使用某种键,例如数字或类似的东西。
“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 列。同时定义一个索引。然后,格式化列“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 );
}