Sort Datagridview with multiple columns using BindingSource in VB.NET
When you have to sort datagridview with multiple columns then follow the code below. This code is tested with Visual Studio 2005 and VB.net window application.
Here I am making sorting with two columns, first column is dynamic (as user clicked) and second column is fixed (default). You can extend this as per your requirement.
Basically this code will help you to understand how you can do sorting in datagridview with multiple columns.
'Declare one shared/Static variable to take care of persisting the state of sort direction
Shared sortDirection As String = " ASC "
**dtDataTable is the table which used to bind the DataGridView1
Private Sub DataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
Dim dataGridBindingSource As New BindingSource
dataGridBindingSource.DataSource = dtDataTable
'This is (ID ASC) first column I made it fixed
Dim defaultColumn As String = "ID ASC"
Dim sortColumnOrder As New StringBuilder
Const ASC As String = " ASC "
Const DESC As String = " DESC "
'This code will sort the grid with secondary column as Option
If sortDirection = ASC Then
sortDirection = DESC
ElseIf sortDirection = DESC Then
sortDirection = ASC
'Collect Column name and built Sort string
'Sort the Binding Source
dataGridBindingSource.Sort = sortColumnOrder.ToString()
'Finally Bind the DataGrid with sorted data table source
Me.DataGridView1.DataSource = dataGridBindingSource
When user click on the datagridview header, any column to sort then records would be sorted based on the sortColumnOrder string created. For example if user clicks on the second column header to sort then sortColumnOrder string would be
"Second Column ASC/DESC, First Column ASC/DESC"
If user clicks on the fourth column to sort then sortColumnOrder string would be
"Fourth Column ASC/DESC, First Column ASC/DESC" etc
You can make this code to create sort string as per user requirement like
"1st column ASC/DESC, 2nd column ASC/DESC, 3rd column ASC/DESC" etc.