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

StackOverflow https://stackoverflow.com/questions/47169

  •  09-06-2019
  •  | 
  •  

我想根据我的项目中有多少项目来启用/禁用一些其他控件 ListView 控制。我找不到任何可以执行此操作的事件,无论是 ListView 本身或在 ListViewItemCollection. 。也许有一种方法可以通用地监视 C# 中的任何集合的更改?

我也会对其他事件感到满意,即使是那些有时在项目没有改变时触发的事件,但例如 ControlAddedLayout 活动没有成功:(。

有帮助吗?

解决方案

@多梅尼克

不太确定,从来没有在思考过程中走得那么远。

另一个解决方案可能是扩展 ListView,并且在添加和删除内容时,不调用 .items.add 和 items.remove,而是调用其他函数。仍然可以在不引发事件的情况下添加和删除,但是通过一些代码审查以确保不直接调用 .items.add 和 .items.remove ,它可以很好地工作。这是一个小例子。我只展示了 1 个添加函数,但如果您想使用所有可用的添加函数,则必须实现 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

其他提示

我找不到您可以使用的任何事件。也许您可以子类化 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 并提供您想要的事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top