Existe um evento que é acionado se o número de ListViewItems em um ListView for alterado?(Formulários do Windows)
Pergunta
Gostaria de ativar/desativar alguns outros controles com base em quantos itens estão no meu ListView
ao controle.Não consigo encontrar nenhum evento que faça isso, seja no ListView
em si ou no ListViewItemCollection
.Talvez haja uma maneira de observar genericamente qualquer coleção em C# em busca de alterações?
Eu ficaria feliz com outros eventos também, mesmo aqueles que às vezes são acionados quando os itens não mudam, mas por exemplo o ControlAdded
e Layout
eventos não funcionaram :(.
Solução
@Domenic
Não tenho muita certeza, nunca cheguei tão longe no processo de pensamento.
Outra solução pode ser estender o ListView e, ao adicionar e remover coisas, em vez de chamar .items.add e items.remove, você chama suas outras funções.Ainda seria possível adicionar e remover sem que eventos fossem gerados, mas com uma pequena revisão de código para garantir que .items.add e .items.remove não fossem chamados diretamente, poderia funcionar muito bem.Aqui está um pequeno exemplo.Mostrei apenas 1 função Add, mas há 6 que você teria que implementar, se quisesse usar todas as funções add disponíveis.Há também .AddRange e .Clear que você pode querer dar uma olhada.
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
Outras dicas
Não consigo encontrar nenhum evento que você possa usar.Talvez você possa criar uma subclasse de ListViewItemCollection e gerar seu próprio evento quando algo for adicionado, com código semelhante 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
Acho que a melhor coisa que você pode fazer aqui é criar uma subclasse de ListView e fornecer os eventos desejados.