Esiste un evento che si attiva se il numero di ListViewItems in un ListView cambia?(Windows Form)
Domanda
Vorrei abilitare/disabilitare alcuni altri controlli in base al numero di elementi presenti nel mio ListView
controllo.Non riesco a trovare nessun evento che possa farlo, neanche su ListView
stesso o sul ListViewItemCollection
.Forse c'è un modo per guardare genericamente qualsiasi raccolta in C# per eventuali modifiche?
Sarei felice anche con altri eventi, anche quelli che a volte si attivano quando gli elementi non cambiano, ma ad esempio the ControlAdded
E Layout
gli eventi non hanno funzionato :(.
Soluzione
@Domenico
Non troppo sicuro, non sono mai arrivato così lontano nel processo di pensiero.
Un'altra soluzione potrebbe essere quella di estendere ListView e, quando si aggiungono e rimuovono elementi, invece di chiamare .items.add e items.remove, chiamare le altre funzioni.Sarebbe ancora possibile aggiungere e rimuovere senza che vengano generati eventi, ma con una piccola revisione del codice per assicurarsi che .items.add e .items.remove non vengano chiamati direttamente, potrebbe funzionare abbastanza bene.Ecco un piccolo esempio.Ho mostrato solo 1 funzione Aggiungi, ma ce ne sono 6 che dovresti implementare, se desideri utilizzare tutte le funzioni di aggiunta disponibili.Ci sono anche .AddRange e .Clear a cui potresti voler dare un'occhiata.
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
Altri suggerimenti
Non riesco a trovare eventi che potresti utilizzare.Forse potresti creare una sottoclasse ListViewItemCollection e generare il tuo evento quando viene aggiunto qualcosa, con un codice simile a questo.
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
Penso che la cosa migliore che puoi fare qui sia creare una sottoclasse ListView e fornire gli eventi desiderati.