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 |
如果我删除
任何帮助表示赞赏。
谢谢
我最终解决了这个问题,方法是创建一个继承 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 ... |
但是,我还找到了以下链接,它允许您从单个列表视图项目中完全删除复选框,这是我最初试图实现的。我刚刚将代码添加到我的自定义列表视图类并将代码应用于每个列表视图项。