Esiste un evento che si attiva se il numero di ListViewItems in un ListView cambia?(Windows Form)

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

  •  09-06-2019
  •  | 
  •  

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 :(.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top