¿Existe algún evento que se active si cambia la cantidad de ListViewItems en un ListView?(Formularios de Windows)
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 :(.
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.