Существует ли событие, которое срабатывает, если количество ListViewItems в ListView изменяется?(Формы Windows)
Вопрос
Я хотел бы включить/отключить некоторые другие элементы управления в зависимости от количества элементов в моем 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 и предоставить нужные вам события.