首页 > 解决方案 > Listview - itemchecked

问题描述

我需要有关使用 ListView.ItemChecked 事件的帮助。在一个新过程(由 ItemChecked 事件触发)中,我需要从检查的记录中提取数据。

这是不起作用的代码(完成):

Private Sub lvDetail_ItemChecked(sender As Object, e As ItemCheckedEventArgs) Handles lvDetail.ItemChecked
    If e.Item.Checked Then
        MsgBox("Selected: " & e.Item.SubItems(4).Text)
    Else
        MsgBox("Deselected: " & e.Item.SubItems(4).Text)
    End If
End Sub

在 lvDetail 控件中添加所有记录时,lvDetail.ItemChecked 事件似乎运行我为每一行编写的测试。

要填充 listview 对象,我需要在循环中使用 Add 语句:

For Each ws_film In ws_elenco_film
Dim item As New ListViewItem(ws_film.Get_Titolo)

item.SubItems.Add(ws_film.Get_Id_tmdb)

lvFilmDetail.Items.Add(item)
Next

lvFilmDetail.EndUpdate()

当我填充列表视图时,将为所有记录执行事件过程......

谁能帮我?

谢谢塞莫拉

标签: vb.netlistview

解决方案


看起来没有办法绕过正在引发的事件。我只是在添加项目之前测试了设置CheckBoxesFalse这防止了在添加项目时引发事件,但再次设置CheckBoxes为会True导致为每个项目引发事件。

我建议您最好的选择是使用您自己的标志,您可以在事件处理程序中进行测试。它不会停止引发事件,但你实际上不必做任何事情。例如

Private Sub lvDetail_ItemChecked(sender As Object, e As ItemCheckedEventArgs) Handles lvDetail.ItemChecked
    If Not ignoredItemChecked Then
        If e.Item.Checked Then
            MsgBox("Selected: " & e.Item.SubItems(4).Text)
        Else
            MsgBox("Deselected: " & e.Item.SubItems(4).Text)
        End If
    End If
End Sub

ignoreItemChecked = True

For Each ws_film In ws_elenco_film
    Dim item As New ListViewItem(ws_film.Get_Titolo)

    item.SubItems.Add(ws_film.Get_Id_tmdb)

    lvFilmDetail.Items.Add(item)
Next

ignoreItemChecked = False

另一种方法是不使用Handles子句,而是使用注册事件处理程序,AddHandler并且在它已经填充之前不要这样做。


推荐阅读