如何在不牺牲ListView功能的情况下禁用其他复选框选择/取消选择?我知道你可以调用:ListView.Enabled = False,但是它也会禁用其中的任何滚动。
例如:我有一个计时器,它根据检查的Listview项启动备份。经过一段时间后,我不希望最终用户能够点击列表视图中的任何复选框(所以我有一定数量的要备份的项目),但我确实希望它们能够滚动正在执行备份时的列表。我试过这个:
Private Sub clboxOptions_ItemChecked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles clboxOptions.ItemChecked
If backupStarted = True Then
If e.Item.Checked = True Then
e.Item.Checked = False
Else
e.Item.Checked = True
End If
但这似乎对我不起作用。谢谢! JFV
这是禁用用户单击listviewitem复选框的另一种方法。
Public Sub ChangeItemCheckState(ByVal val As Boolean, ByVal index As Integer)
If Monitor.TryEnter(Me.Items(index), 10) Then
Try
Me.Items(index).Checked = val
Finally
Monitor.Exit(Me.Items(index))
End Try
End If
End Sub
Public Sub ChangeItemCheckState(ByVal val As Boolean, ByVal item As ListViewItem)
If Monitor.TryEnter(item, 10) Then
Try
item.Checked = val
Finally
Monitor.Exit(item)
End Try
End If
End Sub
Private Sub ListviewOPC_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles Me.ItemCheck
If Monitor.IsEntered(Me.Items(e.Index)) Then
'
Else
'prevent click from users
e.NewValue = e.CurrentValue
End If
End Sub
这个方法是线程安全的。要更改项目的checkedstate,您必须调用ChangeItemCheckState方法。如果要通过单击启用/禁用项目检查,则必须添加另一个属性。
Private disableUserCheckItem As Boolean
Public Property PreventUserCheckItem() As Boolean
Get
Return disableUserCheckItem
End Get
Set(ByVal value As Boolean)
disableUserCheckItem = value
End Set
End Property
Public Sub ChangeItemCheckState(ByVal val As Boolean, ByVal index As Integer)
If Monitor.TryEnter(Me.Items(index), 10) Then
Try
Me.Items(index).Checked = val
Finally
Monitor.Exit(Me.Items(index))
End Try
End If
End Sub
Public Sub ChangeItemCheckState(ByVal val As Boolean, ByVal item As ListViewItem)
If Monitor.TryEnter(item, 10) Then
Try
item.Checked = val
Finally
Monitor.Exit(item)
End Try
End If
End Sub
Private Sub ListviewOPC_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles Me.ItemCheck
If Monitor.IsEntered(Me.Items(e.Index)) Then
'do nothing or other nessesary things.
Else
'prevent click from users
If PreventUserCheckItem Then
e.NewValue = e.CurrentValue
End If
End If
End Sub
而是使用内置的CheckBoxes属性,您可以自己绘制复选框。
谷歌周围找到了OwnerDraw ListView的一个例子。自己绘制复选框。向ListView添加一个新属性(类似于ReadOnly)。如果ReadOnly为true,则将复选框绘制为禁用,并忽略单击消息。
您可以使用ObjectListView(它是普通.NET ListView的包装器)。它提供了一个回调CheckStatePutter,当用户点击一个复选框时会调用它。在该回调中,您可以决定是否接受新的复选框值。
这是一个描述这个过程的食谱:How do I use checkboxes in my ObjectListView?
我发现了我的问题。我使用'ItemChecked'而不是'ItemCheck'方法。以下代码适用于我:
Private Sub clboxOptions_ItemCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckEventArgs) Handles clboxOptions.ItemCheck
Try
If backupStarted = True Then
If e.CurrentValue <> e.NewValue Then
e.NewValue = e.CurrentValue
Else
e.NewValue = e.NewValue
End If
End If
End Sub
我想在Listview中禁用CheckBox。当我点击Button Go时。我正在使用'ItemChecked'方法。我使用代码:
Public Sub CheckBoxChecked(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs)
Try
If bCheckFromEvent Then
bCheckFromEvent = False
Return
End If
If BrunService Then
bCheckFromEvent = True
ListView.Items(e.Item.Index).Checked = Not ListView.Items(e.Item.Index).Checked
End If
Catch ex As Exception
MsgBox("CheckBoxChecked: " & ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "ERROR")
End Try
End Sub