以编程方式选择并突出显示VB.NET中的ListView行

时间:2017-08-15 12:45:32

标签: vb.net listview

我想做一些看似简单的事情 - 以编程方式选择并在VB.NET中突出显示一行ListView。

VB.NET: How to dynamically select a list view item?

告诉我应该是什么,但事实并非如此。该行已被选中,但未突出显示。

http://vbcity.com/forums/t/28260.aspx

告诉我关于“HideSelection”属性和.Focus()方法(也在Select programmatically a row of a Listview引用),听起来很有希望,但我能得到的最好的亮点是提到的微弱亮点,我想要完整的monty 。我尝试了一个只有ListView的Noddy示例,在Details模式下,FullRowSelection = true,HideSelection = False,定义了一个columnheader然后

    ListView1.Items.Add("Red")
    ListView1.Items.Add("Orange")
    ListView1.Items.Add("Yellow")
    ListView1.Items.Add("Green")

    ListView1.Items(2).Selected = True

我明白了

enter image description here

但我想要这个

enter image description here

我可以通过添加这些行来模拟突出显示

ListView1.SelectedItems(0).BackColor = Color.CornflowerBlue
ListView1.SelectedItems(0).ForeColor = Color.White

但是,如果行可以隐式显示以及明确取消选择,我怎么能确定撤消人工突出显示呢?我是否必须考虑所有可能的情况?这应该是一个简单的操作,这太多了。另外,由于我想对行进行颜色编码,还有一个额外的挑战,当我撤消高亮颜色时,我必须弄清楚那个点适合的颜色。有更好,更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

您可以访问用于绘制每个项目的Graphics对象,并自己绘制它们。

使用Button和ListView创建一个新项目。粘贴以下代码:

Form_Load使用多个子项

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.ListView1.OwnerDraw = True ' or else can't handle DrawItem event
    ListView1.Columns.Add("ColumnHeader1")
    ListView1.Columns.Add("ColumnHeader2")
    ListView1.Columns.Add("ColumnHeader3")
    Me.ListView1.Items.Add("Red")
    Me.ListView1.Items.Add("Orange")
    Me.ListView1.Items.Add("Yellow")
    Me.ListView1.Items.Add("Green")
    ListView1.Items(0).SubItems.Add("Strawberry")
    ListView1.Items(0).SubItems.Add("Apple")
    ListView1.Items(1).SubItems.Add("Pepper")
    ListView1.Items(1).SubItems.Add("Apricot")
    ListView1.Items(2).SubItems.Add("Plum")
    ListView1.Items(2).SubItems.Add("Banana")
    ListView1.Items(3).SubItems.Add("Apple")
    ListView1.Items(3).SubItems.Add("Lime")
End Sub

ListView的绘图相关事件的三个​​处理程序。从this answer

复制的代码
Private Sub listView1_DrawColumnHeader(sender As Object, e As DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
    e.DrawDefault = True
End Sub

Private Sub listView1_DrawSubItem(sender As Object, e As DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
    Const TEXT_OFFSET As Integer = 1
    ' I don't know why the text is located at 1px to the right. Maybe it's only for me.
    Dim listView As ListView = DirectCast(sender, ListView)

    ' Check if e.Item is selected and the ListView has a focus.
    If Not listView.Focused AndAlso e.Item.Selected Then
        Dim rowBounds As Rectangle = e.SubItem.Bounds
        Dim labelBounds As Rectangle = e.Item.GetBounds(ItemBoundsPortion.Label)
        Dim leftMargin As Integer = labelBounds.Left - TEXT_OFFSET
        Dim bounds As New Rectangle(rowBounds.Left + leftMargin, rowBounds.Top, If(e.ColumnIndex = 0, labelBounds.Width, (rowBounds.Width - leftMargin - TEXT_OFFSET)), rowBounds.Height)
        Dim align As TextFormatFlags
        Select Case listView.Columns(e.ColumnIndex).TextAlign
            Case HorizontalAlignment.Right
                align = TextFormatFlags.Right
                Exit Select
            Case HorizontalAlignment.Center
                align = TextFormatFlags.HorizontalCenter
                Exit Select
            Case Else
                align = TextFormatFlags.Left
                Exit Select
        End Select
        TextRenderer.DrawText(e.Graphics, e.SubItem.Text, listView.Font, bounds, SystemColors.HighlightText, align Or TextFormatFlags.SingleLine Or TextFormatFlags.GlyphOverhangPadding Or TextFormatFlags.VerticalCenter Or TextFormatFlags.WordEllipsis)
    Else
        e.DrawDefault = True
    End If
End Sub

Private Sub listView1_DrawItem(sender As Object, e As DrawListViewItemEventArgs) Handles ListView1.DrawItem
    Dim listView As ListView = DirectCast(sender, ListView)

    ' Check if e.Item is selected and the ListView has a focus.
    If Not listView.Focused AndAlso e.Item.Selected Then
        Dim rowBounds As Rectangle = e.Bounds
        Dim leftMargin As Integer = e.Item.GetBounds(ItemBoundsPortion.Label).Left
        Dim bounds As New Rectangle(leftMargin, rowBounds.Top, rowBounds.Width - leftMargin, rowBounds.Height)
        e.Graphics.FillRectangle(SystemBrushes.Highlight, bounds)
    Else
        e.DrawDefault = True
    End If
End Sub

按钮单击处理程序以模拟选定的项目(2)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.ListView1.Items(2).Selected = True
End Sub

这将绘制背景颜色,无论焦点。你也可以控制其他颜色和字体。

此处,单击按钮,选择项目2,同时按钮仍具有焦点,并选择项目。

enter image description here

答案 1 :(得分:0)

最简单的事情,

每次选择不同的项目时只需分配 LST_ItemIndex = lstList.FocusedItem.Index

然后在需要突出显示时触发以下代码

如果 lstList.Items.Count > 0 那么

        lstList.Items(LST_ItemIndex).Selected = True
        lstList.Items(LST_ItemIndex).EnsureVisible()
       
    End If