Try handling the
DataGridView.ColumnDisplayIndexChanged Event (System.Windows.Forms) | Microsoft Docs[
^] instead
ADDED
If I understand the situation correctly, you can use the event mentioned above and create a new data source each time the ordering changes.
For example if you have two DataGridView objects on a window (dgv1 and dgv2), consider the following code
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim data1 As DataTable = New DataTable()
data1.Columns.Add("First")
data1.Columns.Add("Second")
data1.Columns.Add("Third")
dgv1.DataSource = data1
DisplayColumns()
End Sub
Private Sub dgv1_ColumnDisplayIndexChanged(sender As Object, e As DataGridViewColumnEventArgs) Handles dgv1.ColumnDisplayIndexChanged
DisplayColumns()
End Sub
Private Sub DisplayColumns()
Dim data2 As DataTable = New DataTable()
data2.Columns.Add("Ordinal", GetType(Integer))
data2.Columns.Add("ColumnName", GetType(String))
Dim colList = From column In dgv1.Columns.Cast(Of DataGridViewColumn) Order By column.DisplayIndex
For Each col As DataGridViewColumn In colList
data2.Rows.Add(col.DisplayIndex, col.HeaderText)
Next
dgv2.DataSource = data2
End Sub
End Class