ListView自定义突出显示所选行中的列

时间:2014-11-01 11:51:49

标签: c# winforms listview

我使用的ListView包含一些用户可以点击的子项(有些他不能)。每行都是相同的。我用一定的背景标记这些可点击的子项。

但是当选择整行时(和FullRowSelect = true),突出显示会为所有子设置相同的背景颜色。

我想要做的是向用户显示他选择了哪一行,但仍保留子项目的不同背景。我玩了一点所有者绘制ListView,但找不到办法做到这一点。

感谢您的帮助! 汤姆

1 个答案:

答案 0 :(得分:1)

您需要将ListView设置为OwnerDraw并使用以下代码:

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    if ( e.SubItem.Name != "click1") e.DrawDefault = true; 
    else
    {
        if (e.Item.Selected)
              e.Graphics.FillRectangle(Brushes.SeaShell, 
                                       new Rectangle(e.Bounds.Location, e.Bounds.Size));
        else  e.Graphics.FillRectangle(Brushes.WhiteSmoke, 
                                       new Rectangle(e.Bounds.Location, e.Bounds.Size));
        e.DrawText();
    }
}

private void listView1_DrawColumnHeader(object sender, 
                                        DrawListViewColumnHeaderEventArgs e)
{
    e.DrawDefault = true;
}

显然,您不仅会调整两种颜色/画笔,还会调整可点击列的名称和检查。(可能使用e.SubItem.Name.StartsWith("click_" ..)

请注意,您需要设置要查看的Names的{​​{1}}; eventParms中没有提供SubItemIndex。另请注意,您可能需要在代码中分配SubItems,即在创建/添加Name时;我在设计师中设置的名字不知何故不坚持/工作!另请注意您在需要时如何获得ListViewItem.ListViewSubItem资格!