Saving a DataView in Session
Most .NET developers store a DataSet in a Session variable, then create a DataView from the DataSet's DataTable on Page_Load in order to get a different sort and/or filter.
However, you can store the DataView in a Session variable by itself! And it will still contain data when you pull it out of the Session variable on another page!
' Create and fill a DataTable from Northwind's Customer table
Dim connString As String = "Server=(local);Database=Northwind;UID=sa;PWD=myPassword"
Dim sqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(connString)
Dim sqlSelectCmd As SqlClient.SqlCommand = New SqlClient.SqlCommand("Select * From Customers", sqlConn)
Dim sqlDataAdapter As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter
sqlDataAdapter.SelectCommand = sqlSelectCmd
Dim dataTable As DataTable = New DataTable("Customers")
sqlDataAdapter.Fill(dataTable)
' Create a new DataView from the Customers DataTable
Dim dataView As DataView = dataTable.DefaultView
' Place the DataView into Session var
Session("dataView") = dataView
' Redirect to another web page
Response.Redirect("WebForm2.aspx")
Now you might think (as I did for a while) that the DataView is making a copy of the DataTable into it's Table property (since rows.count was > 0).
Dim dataView As DataView = DirectCast(Session("dataView"), DataView)
Dim rowCount As Integer = dataView.Table.Rows.Count
However, that is not the case (thanks to Thomas Tomiczek who noticed the correct behavior)! What happens is that the DataView still has a reference to the DataTable. And hence that DataTable stays in memory until the DataView releases the reference. Then the DataTable will be removed when GC occurs.
Saving a DataView in session is pretty cool (most folks don't know that you can do this). But the key point here is that the DataView does NOT make a copy of the data. It still is using the referenced DataTable underneath the covers...