Winforms 如果ListView中ListViewItems的数量发生变化,是否会触发事件?(Windows窗体)

Winforms 如果ListView中ListViewItems的数量发生变化,是否会触发事件?(Windows窗体),winforms,events,listview,Winforms,Events,Listview,我想根据我的ListView控件中的项目数量启用/禁用一些其他控件。我在ListView本身或ListViewItemCollection上找不到任何可以执行此操作的事件。也许有一种方法可以在C#中查看任何集合的变化 我对其他事件也很满意,即使是在项目没有更改时有时会触发的事件,但例如ControlAdded和Layout事件不起作用:(.我找不到任何您可以使用的事件。也许您可以将ListViewItemCollection子类化,并在添加内容时引发您自己的事件,代码与此类似 Public Cl

我想根据我的
ListView
控件中的项目数量启用/禁用一些其他控件。我在
ListView
本身或
ListViewItemCollection
上找不到任何可以执行此操作的事件。也许有一种方法可以在C#中查看任何集合的变化


我对其他事件也很满意,即使是在项目没有更改时有时会触发的事件,但例如
ControlAdded
Layout
事件不起作用:(.

我找不到任何您可以使用的事件。也许您可以将ListViewItemCollection子类化,并在添加内容时引发您自己的事件,代码与此类似

Public Class MyListViewItemCollection
    Inherits ListView.ListViewItemCollection

    Public Event ItemAdded(ByVal Item As ListViewItem)

    Sub New(ByVal owner As ListView)
        MyBase.New(owner)
    End Sub

    Public Overrides Function Add(ByVal value As System.Windows.Forms.ListViewItem) As System.Windows.Forms.ListViewItem
        Dim Item As ListViewItem

        Item = MyBase.Add(value)

        RaiseEvent ItemAdded(Item)

        Return Item
    End Function
End Class

我认为您在这里可以做的最好的事情是对ListView进行子类化,并提供所需的事件。

@Domenic

不太确定,在思考过程中从未走那么远

另一种解决方案可能是扩展ListView,在添加和删除内容时,您可以调用其他函数,而不是调用.items.add和.items.remove。在不引发事件的情况下,仍然可以添加和删除内容,但需要进行一些代码检查,以确保没有直接调用.items.add和.items.remove,这可能会起作用非常好。这里有一个小例子。我只展示了1个Add函数,但如果您想使用所有可用的Add函数,则必须实现6个。另外还有.AddRange和.Clear,您可能想看看

Public Class MonitoredListView
    Inherits ListView

    Public Event ItemAdded()
    Public Event ItemRemoved()

    Public Sub New()
        MyBase.New()
    End Sub

    Public Function AddItem(ByVal Text As String) As ListViewItem
        RaiseEvent ItemAdded()

        MyBase.Items.Add(Text)
    End Function

    Public Sub RemoveItem(ByVal Item As ListViewItem)
        RaiseEvent ItemRemoved()

        MyBase.Items.Remove(Item)
    End Sub

End Class

我认为最好在进行更改后引发事件,而不是在更改之前。或者,您可以有两个事件。
RaiseEvent itemsadding();
用于更改之前,而
RaiseEvent itemsadded();
用于更改之后。