¿Existe algún evento que se active si cambia la cantidad de ListViewItems en un ListView?(Formularios de Windows)

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Me gustaría habilitar/deshabilitar algunos otros controles según la cantidad de elementos que hay en mi ListView control.No puedo encontrar ningún evento que haga esto, ni en el ListView mismo o en el ListViewItemCollection.¿Quizás haya una manera de observar genéricamente cualquier colección en C# para detectar cambios?

También estaría contento con otros eventos, incluso aquellos que a veces se activan cuando los elementos no cambian, pero por ejemplo el ControlAdded y Layout los eventos no funcionaron :(.

¿Fue útil?

Solución

@Doménico

No estoy muy seguro. Nunca llegué tan lejos en el proceso de pensamiento.

Otra solución podría ser extender ListView y, al agregar y eliminar cosas, en lugar de llamar a .items.add y items.remove, llame a sus otras funciones.Aún sería posible agregar y eliminar sin que se generen eventos, pero con una pequeña revisión del código para asegurarse de que .items.add y .items.remove no se llamen directamente, podría funcionar bastante bien.He aquí un pequeño ejemplo.Solo mostré 1 función Agregar, pero hay 6 que tendrías que implementar si quisieras utilizar todas las funciones agregar disponibles.También están .AddRange y .Clear que quizás quieras echarle un vistazo.

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

Otros consejos

No puedo encontrar ningún evento que puedas usar.Quizás podría crear una subclase de ListViewItemCollection y generar su propio evento cuando se agregue algo, con un código similar a este.

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

Creo que lo mejor que puedes hacer aquí es crear una subclase de ListView y proporcionar los eventos que desees.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top