Inquiridor
ListView

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.
- Editado João Paulo MDS sábado, 13 de março de 2021 20:44
Todas as Respostas
-
-
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
-