Existe um evento que é acionado se o número de ListViewItems em um ListView for alterado?(Formulários do Windows)

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

  •  09-06-2019
  •  | 
  •  

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top