Is this a Windows or web app? DataGridView is Windows, but you're talking about ViewState, so I assume you've got a web app with a GridView. Assuming that's the case, you're getting your "Empty" message every time because your grid's data source is nothing on postback (which is normal). If you want access to the data source, add it to ViewState at the same time you bind it, and then fetch it out here in the sort handler. And this will also address your primary question: when you apply your sort, you are rebinding, so you need to preserve and re-apply any filter that is present as well. Something like this:
Using dv As New DataView(ViewState(MY_DATA))
dv.Sort = e.SortExpression & " " & ConvertSortDirectionToSql(e.SortDirection)
ViewState(MY_SORT) = dv.Sort
If ViewState(MY_FILTER) IsNot Nothing Then dv.RowFilter = ViewState(MY_FILTER)
grdNurseVisits.DataSource = dv
grdNurseVisits.DataBind()
End Using