I made this for someone back in March and it works with 4 Columns in a ListView.
1 ListView needed for testing.
Option Strict On
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With ListView1
.Columns.Add("FirstName", 100) : .Columns.Add("LastName", 100) : .Columns.Add("Age", 100) : .Columns.Add("In Class?", 100) : .View = View.Details : .CheckBoxes = True : .FullRowSelect = True
With .Items
Dim lvItm As New ListViewItem("xnew,subitem,23,Yes".Split(CChar(",")))
.Add(lvItm)
lvItm = New ListViewItem("a 1new,1subitem,23,No".Split(CChar(",")))
.Add(lvItm)
lvItm = New ListViewItem("b 2new,2subitem,23,Yes".Split(CChar(",")))
.Add(lvItm)
lvItm = New ListViewItem("c 2new,1subitem,43,No".Split(CChar(",")))
.Add(lvItm)
lvItm = New ListViewItem("a 2new,2subitem,43,Yes".Split(CChar(",")))
.Add(lvItm)
End With
End With
End Sub
Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
'// check if it contains items.
If Not ListView1.Items.Count = 0 Then lvColumnSort(e.Column, ListView1) '// send Column Index and the ListView used.
End Sub
#Region "================= SORT LISTVIEW COLUMNS BY SELECTED COLUMN ================="
Private arlSortLvItems As New ArrayList '// adds ListView items to.
Private bSortDescending As Boolean = True '// Toggles if .Ascending or Descending.
Private Sub lvColumnSort(ByVal columnIndex As Integer, ByVal selectedListView As ListView)
With selectedListView
arlSortLvItems.Clear() '// clear ArrayList for new input.
For Each itm As ListViewItem In .Items '// loop thru ListView.Items
Select Case columnIndex '// check which column is clicked and add items to ArrayList as needed, first item will be the .Sorting item.
Case 0 '// FirstName, LastName, Age, InClass.
arlSortLvItems.Add(itm.Text & "~" & itm.SubItems(1).Text & "~" & itm.SubItems(2).Text & "~" & itm.SubItems(3).Text)
Case 1 '// LastName, FirstName, Age, InClass.
arlSortLvItems.Add(itm.SubItems(1).Text & "~" & itm.Text & "~" & itm.SubItems(2).Text & "~" & itm.SubItems(3).Text)
Case 2 '// Age, InClass, FirstName, LastName.
arlSortLvItems.Add(itm.SubItems(2).Text & "~" & itm.SubItems(3).Text & "~" & itm.Text & "~" & itm.SubItems(1).Text)
Case 3 '// InClass, Age, FirstName, LastName.
arlSortLvItems.Add(itm.SubItems(3).Text & "~" & itm.SubItems(2).Text & "~" & itm.Text & "~" & itm.SubItems(1).Text)
End Select
Next
arlSortLvItems.Sort() '// sort ArrayList.
.Items.Clear() '// clear ListView to add Sorted items back.
getSortOrderOfItems(columnIndex, selectedListView, bSortDescending) '// determines if needed to add .Ascending or .Descending.
bSortDescending = Not bSortDescending '// Toggle True/False for next click.
End With
End Sub
Private Sub getSortOrderOfItems(ByVal columnIndex As Integer, ByVal selectedListView As ListView, ByVal isDescending As Boolean)
With selectedListView
.Sorting = SortOrder.None '// No Sort order.
If isDescending Then
For Each itm As String In arlSortLvItems '// loop thru items in ArrayList.
setItemsBackToListView(columnIndex, selectedListView, itm.Split("~"c)) '// .Split to get values as arrays.
Next
Else
For i As Integer = arlSortLvItems.Count - 1 To 0 Step -1 '// loop backwards thru items ArrayList.
setItemsBackToListView(columnIndex, selectedListView, arlSortLvItems(i).ToString.Split("~"c)) '// .Split to get values as arrays.
Next
End If
End With
End Sub
Private Sub setItemsBackToListView(ByVal columnIndex As Integer, ByVal selectedListView As ListView, ByVal ArrayListItem() As String)
With selectedListView
Dim lvItem As New ListViewItem '// new ListView Item.
With lvItem
Select Case columnIndex
Case 0 '// FirstName, LastName, Age, InClass.
.Text = ArrayListItem(0) '// FirstName.
.SubItems.Add(ArrayListItem(1)) '// LastName.
.SubItems.Add(ArrayListItem(2)) '// Age.
.SubItems.Add(ArrayListItem(3)) '// InClass.
Case 1 '// LastName, FirstName, Age, InClass.
.Text = ArrayListItem(1) '// FirstName.
.SubItems.Add(ArrayListItem(0)) '// LastName.
.SubItems.Add(ArrayListItem(2)) '// Age.
.SubItems.Add(ArrayListItem(3)) '// InClass.
Case 2 '// Age, InClass, FirstName, LastName.
.Text = ArrayListItem(2) '// FirstName.
.SubItems.Add(ArrayListItem(3)) '// LastName.
.SubItems.Add(ArrayListItem(0)) '// Age.
.SubItems.Add(ArrayListItem(1)) '// InClass.
Case 3 '// InClass, Age, FirstName, LastName.
.Text = ArrayListItem(2) '// FirstName.
.SubItems.Add(ArrayListItem(3)) '// LastName.
.SubItems.Add(ArrayListItem(1)) '// Age.
.SubItems.Add(ArrayListItem(0)) '// InClass.
End Select
End With
.Items.Add(lvItem) '// add item back to ListView.
End With
End Sub
#End Region
End Class