【问题标题】:Prevent ListView From Deselect防止 ListView 取消选择
【发布时间】:2014-02-06 14:23:29
【问题描述】:

目标

如果列表视图中有 1 个或多个项目,并且用户在列表视图的空白处单击,则所选项目应保持选中状态。

换句话说,如果一个项目被选中,它应该保持选中状态,除非另一个项目被选中。

现状

我将 ListView HideSelection 的属性设置为 false,这将使选定的 ListViewItem 在控件失去焦点时保持选中状态。但是,当我单击 Listview 的空白时,这并不能解决问题。

有什么建议吗?

【问题讨论】:

  • 那会有问题。如果您在 SelectedIndex changed 事件中强制进行选择,您最终可能会在 SingleSelect 模式下选择 2 个项目,因为该事件会触发两次。第一个 - 旧项目已取消选择,您的代码看不到任何选择,因此您手动选择一个,例如项目(0);第二 - 单击的项目触发事件以选择它,让您选择 2 个项目,这让用户感到困惑。此外,HideSelection 不会做任何事情来取消选择项目,它只是在 LV 没有焦点时为所选项目绘制选择提示。当它不在一个项目上时,尝试吃掉点击事件

标签: vb.net listview select


【解决方案1】:

您可以通过继承ListView 来实现这一点:

Public Class UIListView
    Inherits ListView

    Private Sub WmLButtonDown(ByRef m As Message)
        Dim pt As Point = New Point(m.LParam.ToInt32())
        Dim ht As ListViewHitTestInfo = Me.HitTest(pt)
        If (ht.Item Is Nothing) Then
            m.Result = IntPtr.Zero
        Else
            MyBase.WndProc(m)
        End If
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_LBUTTONDOWN
                Me.WmLButtonDown(m)
                Exit Select
            Case Else
                MyBase.WndProc(m)
                Exit Select
        End Select
    End Sub

    Private Const WM_LBUTTONDOWN As Integer = &H201

End Class

【讨论】:

  • 有趣。我将课程添加到我的项目中,但我不确定如何使用它...:s
  • 只需重新构建您的项目,它就会在工具箱顶部弹出。
  • 啊!我懂了。让我测试一下!
  • 完美运行。谢谢!
  • 问:如果我想把自定义控件放在一个单独的类库项目中,从那个项目中创建一个 dll 文件,并将 dll 添加到引用中。该控件未出现在工具箱中。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多