【问题标题】:ListView Control Windows API - CheckAll - CheckCount?ListView 控件 Windows API - CheckAll - CheckCount?
【发布时间】:2014-12-16 15:37:11
【问题描述】:

我有一个 VB6 项目,我正在从使用 ListBoxes 切换到使用 ListViews。列表具有复选框样式。我正在寻找要发送到 ListView 的 Windows API 消息,这些消息指定:

  • 全部勾选
  • 取消选中所有
  • 检查计数

这对于 ListBox 来说很容易,因为 Selected 与 Checked 是一样的。 ListView 不是这样。

除了 CHECKED not SELECTED 之外,其他类似的东西:

Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETITEMCOUNT As Long = (LVM_FIRST + 4)
Private Const LVM_GETSELECTEDCOUNT As Long = (LVM_FIRST + 50)
Private Const LV_SETSEL = &H1000 + 43

Private Function ListViewSelectedCount(ByRef LV As ListView) As Long
    ListViewSelectedCount = SendMessage(LV.hwnd, LVM_GETSELECTEDCOUNT, 0, 0)
End Function

Private Sub ListViewSelectAll(ThisBox As ListView)
    Dim LV As LV_ITEM
    LV.mask = &H8
    LV.State = True
    LV.stateMask = &H2

    Call SendMessage(ThisBox.hwnd, LV_SETSEL, ByVal -1, LV)
End Sub

我确实找到了 ListView 消息列表:http://vbnet.mvps.org/index.html?code/comctl/lvmembers.htm 但似乎没有什么是我需要的。

【问题讨论】:

  • 在 MSDN 上查看 Community Additions 的 LVM_SETITEMSTATE。它有一个如何为特定索引设置选中/未选中状态的示例。 但是,根据上面的文档,您可以传递 -1 以同时影响它们。 但据我所知,没有办法返回已检查项目的计数。您必须遍历每个项目并检查其状态,并不断累积。
  • 嗯,部分路比我以前好。谢谢!

标签: listview vb6


【解决方案1】:

您是否有理由必须使用 Windows API 消息来设置选定标志。我假设您正在使用 Microsoft Windows 公共控件中的 ListView。如果你是,那么你可以使用以下代码:

Public Sub SetSelected(ByVal blnCheck As Boolean)
Dim lviItem As ListItem

    For Each lviItem In ListView.ListItems
        lviItem.Checked = blnCheck
    Next

    Set lviItem = Nothing

End Sub

Public Function CountChecked() As Long
Dim lngCount    As Long
Dim lviItem     As ListItem

    For Each lviItem In ListView.ListItems
        If lviItem.Checked Then
            lngCount = lngCount + 1
        End If
    Next

    Set lviItem = Nothing

    CountChecked = lngCount

End Function

使用 true 或 false 调用 SetSelected 并将全选/取消全选,第二个函数将返回计数。您应该将代码的 ListView 位重命名为您的 ListView 的名称。如果你想让它更通用,你可以将 listview 传递给 sub 和 function,代码看起来像这样:

Public Sub SetSelected(ByRef lvwToChange As ListView, ByVal blnCheck As Boolean)
Dim lviItem As ListItem

    For Each lviItem In lvwToChange.ListItems
        lviItem.Checked = blnCheck
    Next

    Set lviItem = Nothing

End Sub

Public Function CountChecked(ByRef lvwToCount As ListView) As Long
Dim lngCount    As Long
Dim lviItem     As ListItem

    For Each lviItem In lvwToCount.ListItems
        If lviItem.Checked Then
            lngCount = lngCount + 1
        End If
    Next

    Set lviItem = Nothing

    CountChecked = lngCount

End Function

希望这会有所帮助。

【讨论】:

  • 感谢您的回复。我是否必须使用 API,不。但是对于 ListBox,循环遍历控件的内容会更慢,我假设 ListView 也会更慢。 (如果存在返回我需要的单个消息,为什么要发送 N 个窗口消息?O(N) vs O(1))因此我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多