none
ListView RRS feed

  • Pergunta

  • Boa tarde, como fazer para a ListView, sempre adicionar os itens em cima. Não em baixo, usei o código abaixo.

     Me.ListView1.Sorting = SortOrder.Ascending

    Porem, não e o que eu procuro.

    Gostaria que sempre que eu adicionar algo, ele sempre fica-se na primeira linha de cima.


    sábado, 13 de março de 2021 20:42

Todas as Respostas

  • Ola João,

    Esse documento tem um exemplo de como fazer o sorting da lista:

    https://docs.microsoft.com/pt-br/dotnet/api/system.windows.forms.listview.sorting?view=net-5.0

    Boa sorte no seu projeto.
    segunda-feira, 15 de março de 2021 12:48
    Moderador
  • Primeiramente, o listview é bem chatinho de trabalhar, ele não possui muitos métodos que facilitam a vida e sempre você vai precisar de um arranjo técnico pra resolver algo que em outros objetos poderia ser mais fácil.

    Primeiro, você precisa adicionar essa classe ao seu projeto, ela simplesmente facilita a ordenação dos objetos, depois estude-a com mais calma.

    Public Class ListViewColumnSorter
        Implements System.Collections.IComparer
    
        Private ColumnToSort As Integer
        Private OrderOfSort As SortOrder
        Private ObjectCompare As CaseInsensitiveComparer
    
        Public Sub New()
            ' Initialize the column to '0'.
            ColumnToSort = 0
    
            ' Initialize the sort order to 'none'.
            OrderOfSort = SortOrder.None
    
            ' Initialize the CaseInsensitiveComparer object.
            ObjectCompare = New CaseInsensitiveComparer()
        End Sub
    
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
            Dim compareResult As Integer
            Dim listviewX As ListViewItem
            Dim listviewY As ListViewItem
    
            ' Cast the objects to be compared to ListViewItem objects.
            listviewX = CType(x, ListViewItem)
            listviewY = CType(y, ListViewItem)
    
            ' Compare the two items.
            compareResult = ObjectCompare.Compare(listviewX.SubItems(ColumnToSort).Text, listviewY.SubItems(ColumnToSort).Text)
    
            ' Calculate the correct return value based on the object 
            ' comparison.
            If (OrderOfSort = SortOrder.Ascending) Then
                ' Ascending sort is selected, return typical result of 
                ' compare operation.
                Return compareResult
            ElseIf (OrderOfSort = SortOrder.Descending) Then
                ' Descending sort is selected, return negative result of 
                ' compare operation.
                Return (-compareResult)
            Else
                ' Return '0' to indicate that they are equal.
                Return 0
            End If
        End Function
    
        Public Property SortColumn() As Integer
            Set(ByVal Value As Integer)
                ColumnToSort = Value
            End Set
    
            Get
                Return ColumnToSort
            End Get
        End Property
    
        Public Property Order() As SortOrder
            Set(ByVal Value As SortOrder)
                OrderOfSort = Value
            End Set
    
            Get
                Return OrderOfSort
            End Get
        End Property
    End Class

    Depois, você precisa ter em seu listview uma coluna auxiliar com um indexador, no exemplo que vou te passar, a cada "AddRow" eu envio a variável q com a quantidade de itens existentes no listview e a ordem será baseada nesse valor descendente.

    Pra testar, crie um userform com um listview e um button.

    Adicione isso no evento Load.

            ListView1.View = View.Details 'define o modo de exibição do listview
    
            ListView1.Columns.Add("Index", 100, HorizontalAlignment.Left)
            ListView1.Columns.Add("Valor", 100, HorizontalAlignment.Left)
    
            For x = 1 To 5
                Dim item As New ListViewItem(Format(x, "00000"), x)
                item.SubItems.Add("Valor " & x)
                ListView1.Items.Add(item)
            Next
    
            lvwColumnSorter.SortColumn = 0
            lvwColumnSorter.Order = SortOrder.Descending
            ListView1.ListViewItemSorter = lvwColumnSorter

    No click do button, coloque isso:

           Dim q As Integer
            q = ListView1.Items.Count + 1
            Dim item As New ListViewItem(Format(q, "00000"), q)
            item.SubItems.Add("Valor " & CStr(q))
            ListView1.Items.Add(item)

    Está claro que isso precisa ser lapidado, ocultar a coluna de index, criar métodos genéricos pra facilitar o additem, e por aí vaí.

    Abraço!


    Natan

    segunda-feira, 15 de março de 2021 13:43
  • me recomendaria outra coisa fora listviwer ?
    quarta-feira, 17 de março de 2021 18:58