Replied 8 September 2017, 12:48 pm EST
I will try to explain this again. Try to think of the data being stored at different levels. You have your DataSource (in your case it is the DataTable object) that stores the data in certain rows. Then, you have a DataView, which is a view of that data. You can sort the rows in the DataView but the underlying DataTable will remain the same row indices. Then, when you bind to the Spread, the data from the DataView are bound to the DataModel of Spread. This 'layer' of the data should mirror the DataView. Then, you have the SheetView's View. Data at this 'layer' can be sorted such the indices of the rows are different from the DataModel/DataView, which could be different from the bound DataSource (DataTable).
So what is happening is you are binding the Spread to an unsorted DataTable. Then you are sorting the Spread's View (this is causing the 1st row from the DataSource DataTable, which is also the 1st row in the DataView and DataModel to be map to the 2nd row in the Spread View). Then, you are getting the DataView from Spread and sorting this View. Now the 2nd row from the DataView becomes the first row. This is reflected in the DataModel, but since there is already a mapping from row 1 to row 2 between the DataModel and the Spread View, you see the data from the 2nd row of the DataTable (Employee = 9) show up as the second row in the new sort instead where you expect it be as the first row.
The code I sent you takes away all the mappings of row indices between the DataModel and Spread's View, so you do not see the behavior as stated above and instead it works for you. You could, instead catch the AutoSortingColumn event and set the Cancel parameter to True. This will keep Spread from sorting the data automatically. Then you can write code in this event to preform your own sort (basically the code you have in your Command_Click) event.