Существует ли событие, которое срабатывает, если количество ListViewItems в ListView изменяется?(Формы Windows)

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Я хотел бы включить/отключить некоторые другие элементы управления в зависимости от количества элементов в моем ListView контроль.Я не могу найти ни одного события, которое могло бы сделать это, ни на ListView сам или на ListViewItemCollection.Может быть, есть способ просмотреть любую коллекцию на C# на наличие изменений?

Я был бы рад и другим событиям, даже тем, которые иногда срабатывают, когда элементы не меняются, но, например, ControlAdded и Layout события не сработали :(.

Это было полезно?

Решение

@Доменик

Не слишком уверен. Никогда не заходил так далеко в мыслительном процессе.

Другим решением может быть расширение ListView, и при добавлении и удалении элементов вместо вызова .items.add и items.remove вы вызываете другие функции.Добавлять и удалять без вызова событий по-прежнему можно, но после небольшой проверки кода, чтобы убедиться, что .items.add и .items.remove не вызываются напрямую, это может сработать вполне хорошо.Вот небольшой пример.Я показал только одну функцию добавления, но вам придется реализовать 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