【问题标题】:Disabling checkbox selections in VB .NET 2008 Winform Listview在 VB .NET 2008 Winform Listview 中禁用复选框选择
【发布时间】:2010-10-24 02:25:16
【问题描述】:

如何在不牺牲 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

但这似乎对我不起作用。 谢谢! 捷豹路虎

【问题讨论】:

  • 我不太明白你的问题...你能说得更具体一点或提供一个例子吗?

标签: vb.net winforms visual-studio-2008 .net-3.5 listview


【解决方案1】:

我想在 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

【讨论】:

    【解决方案2】:

    这是另一种禁用用户单击 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
    

    这个方法是线程安全的。要更改项目的检查状态,您必须调用 ChangeItemCheckState 方法。如果要通过单击启用/禁用 itemcheck,则必须添加另一个属性。

    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
    

    【讨论】:

      【解决方案3】:

      我发现了我的问题所在。我使用的是 '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
      

      【讨论】:

      • 也许是这样:If backupStarted = True Then e.NewValue = e.CurrentValue End If
      【解决方案4】:

      您可以使用ObjectListView(它是一个普通的.NET ListView 的包装器)。它提供了一个回调 CheckStatePutter,当用户单击一个复选框时会调用该回调。在该回调中,您可以决定是否接受新的复选框值。

      这是描述此过程的配方:How do I use checkboxes in my ObjectListView?

      【讨论】:

        【解决方案5】:

        您可以自己绘制复选框,而不是使用内置的 CheckBoxes 属性。

        Google 并找到一个 OwnerDraw ListView 的示例。自己画复选框。向您的 ListView 添加一个新属性(类似于 ReadOnly)。当 ReadOnly 为 true 时,将复选框绘制为禁用并忽略点击消息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-29
          • 1970-01-01
          • 2012-05-19
          • 1970-01-01
          • 1970-01-01
          • 2018-09-18
          • 2011-08-28
          相关资源
          最近更新 更多