列表视图 - 多列 - 更改整行的选择颜色

时间:2015-04-22 17:00:29

标签: vb.net listview colors selection

我想从默认(蓝色)更改ListView中的选择颜色。我无法根据自己的需要调整任何代码。

这是最接近的代码。

  If e.Item.Selected = True Then
        e.Graphics.FillRectangle(New SolidBrush(Color.Gray), e.Bounds)
        TextRenderer.DrawText(e.Graphics, e.Item.Text, New Font(ListView2.Font, Nothing), New Point(e.Bounds.Left + 3, e.Bounds.Top + 2), Color.White)
    Else
        e.DrawDefault = True
    End If

主要问题是e.Item.Text部分。它不适用于多列列表视图。结果如下。

选择前: enter image description here

......之后: enter image description here

是否可以保留其他列的值并仍然具有完整的行选择?

感谢。

1 个答案:

答案 0 :(得分:2)

使用OwnerDraw Listview时要记住的是,如果控件是详细信息{{1},则有 2个事件响应(或覆盖,如果您是子类) }:ViewDrawColumnHeader

当控件使用不同的DrawSubItem并且没有要绘制的子项时,将使用

DrawItem

由于ViewSubItems(0)相同,您可以使用Item.Text绘制项目和子项目文本。我无法分辨该片段的位置,但这可行:

DrawSubItem

您可能正在使用正确的事件,但是使用Private Sub lv1_DrawSubItem(sender As Object, e As DrawListViewSubItemEventArgs) Handles lv1.DrawSubItem ' use sender instead of a hardcodes control ref so ' you can paste this to another LV Dim myLV As ListView = CType(sender, ListView) If e.ItemIndex > 0 AndAlso e.Item.Selected Then Using br As New SolidBrush(Color.Gray) e.Graphics.FillRectangle(br, e.Bounds) End Using Using fnt As New Font(myLV .Font, Nothing) ' use e.SubItem.Text TextRenderer.DrawText(e.Graphics, e.SubItem.Text, fnt, New Point(e.Bounds.Left + 3, e.Bounds.Top + 2), Color.White) End Using ' dispose! Else e.DrawDefault = True End If End Sub 而不是Item.Text,也会为所有子项目绘制项目文本(e.SubItem.Text将被调用和子项目一样多次。

请注意,我还将DrawSubItem包裹在Font块中以处理它。使用LimeGreen,结果:

enter image description here