如何使用C#在ListView中对齐单个子项的文本?

时间:2009-02-18 16:19:12

标签: c# listview text-alignment

我无法在任何地方找到关于这个看似简单的主题的答案:是否可以在WinForms ListView控件中对齐单个子项的文本?

若然,怎么样?

我希望同一列中的文字以不同方式对齐。

6 个答案:

答案 0 :(得分:9)

“ColumnHeader”类具有“TextAlign”属性,该属性将更改列中所有子项的对齐方式。如果你需要更多花哨的东西,你可以随时使用“DrawSubItem”事件并将其绘制为所有者。

答案 1 :(得分:9)

示例:

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

将Column的“1”对齐设置为右

答案 2 :(得分:7)

注意:由于底层本机ListView控件(位于comctl32.dll中)的限制,第一列无法对齐。它将始终对齐左侧。 第二个限制是当您自定义绘制(自定义绘制子项)时:启用列重新排序时,第一列的文本不会正确重新排序。我解决了这个限制(不会把它称为bug,因为listview支持许多列表样式,列表视图的内部数据结构就像一个树),不允许重新排序第一列,这在大多数情况下都没有问题,因为你会在第一列使用某种键,如数字或类似的东西。

答案 3 :(得分:5)

为了将来参考,我的解决方法如下:

// 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,否则不会绘制文本或列分隔符。

答案 4 :(得分:0)

将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.

答案 5 :(得分:0)

以@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 );
        }