关于 vb.net:需要从 OwnerDrawn ListView 中删除复选框但仍保留复选框功能

Need To Remove Checkboxes From OwnerDrawn ListView But Still Keep Checkbox Functionality

我有一个定制的列表视图控件,它向用户显示通知列表。基本上,当一个新的通知进来时,一个新的条目会以粗体形式添加到列表视图中。当用户阅读通知时,它会变成常规字体。

我可能弄清楚如何实现这一点(读取状态)的唯一方法是使用复选框。所以一个新的通知会检查它的项目,当它被阅读时,它是未选中的。这很好用,似乎达到了我的需要。

但是,我的问题是....有没有办法可以删除复选框的绘图,但仍将功能保留在后台。因此,例如,不绘制列表视图项的复选框,但仍然可以使用 ListView.Checkboxes = True 和 ListViewItem.Checked = True?

我的 ListView 控件是所有者绘制的,我的 DrawItem 事件的代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Protected Overrides Sub OnDrawItem(e As DrawListViewItemEventArgs)
    Try
        If Not (e.State And ListViewItemStates.Selected) = 0 Then
            'Draw the background for a selected item.
            e.Graphics.FillRectangle(System.Drawing.SystemBrushes.Highlight, e.Bounds)
            e.DrawFocusRectangle()
        Else
            'Draw the background for an unselected item.
            e.Graphics.FillRectangle(System.Drawing.SystemBrushes.Control, e.Bounds)
        End If

        e.DrawBackground()
        e.DrawDefault = True
        MyBase.OnDrawItem(e)

    Catch ex As Exception
        MsgBox("Exception Error:" & ex.Message, MsgBoxStyle.Critical,"Module: lsvOverdueCalls_DrawItem()")
    End Try
End Sub

如果我删除 e.DrawDefault = True 它会删除复选框,但是我无法控制新通知的粗体字体。

任何帮助表示赞赏。
谢谢


我最终解决了这个问题,方法是创建一个继承 ListViewItem 的新 ListViewItem 类,然后添加一个自定义属性。然后,我在整个代码中使用新类引用 ListViewItem,这允许我向默认 ListViewItem 添加一个新属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Class cust_ListViewItem
    Inherits ListViewItem

    Private _read As Boolean
    Private RegularFont As New Font(Me.Font.FontFamily, Me.Font.size, FontStyle.Regular)
    Private BoldFont As New Font(Me.Font.FontFamily, Me.Font.size, FontStyle.Bold)

    Public Property Read As Boolean
        Get
            Return _read
        End Get
        Set(value As Boolean)
            _read = value
            MarkAsRead()
        End Set
    End Property

    Private Sub MarkAsRead()
        If _read Then Me.Font = RegularFont Else Me.Font = BoldFont
    End Sub
End Class

然后调用我的新属性,我使用了以下内容:

1
2
3
4
    Dim lvi As cust_ListViewItem = New cust_ListViewItem
    If Notifications(x).Read = True Then
    lvi.Read = True
    ...

但是,我还找到了以下链接,它允许您从单个列表视图项目中完全删除复选框,这是我最初试图实现的。我刚刚将代码添加到我的自定义列表视图类并将代码应用于每个列表视图项。